查找具有条件的第一个未使用的ID

时间:2013-08-21 10:42:26

标签: php mysql sql

我有一个MYSQL表,结构如下:

id, A, B, C, D, ...

其中A,B,C,D,......是某些列。

有没有办法选择第一个未使用的id,其中某些列等于某个值?

例如,我有以下数据:

 id  A  B  C  D
----------------
 1   1  1  1  1
 1   3  9  1  4
 2   3  2  1  0
 5   3  1  1  8
 1   2  5  4  2

我想在A=3C=1

中选择第一个未使用的ID

所以我想只考虑中间3行(因为它们有A = 3和C = 1)并返回3作为结果(因为它是1,2,5中第一个未使用的id) IDS)。

提前致谢!

5 个答案:

答案 0 :(得分:1)

你可以像@Gordon Linoff所展示的那样,或者通过变量:

SET @i=(SELECT MIN(id) FROM test WHERE A=3 AND C=1);
SELECT 
  id+1 AS first_unused 
FROM 
  (SELECT 
      id, 
      @i:=@i+1 AS seq 
  FROM test 
  WHERE 
    A=3 AND C=1
  ) AS sequence 
WHERE id+1=seq 
ORDER BY id DESC 
LIMIT 1;

即使您的ID不是从1开始也是如此

答案 1 :(得分:0)

以下是一种使用“不存在”的方法:

select t.*
from t
where A = 3 and C = 1 and
      not exists (select 1
                  from t t2
                  where t2.A = 3 and t2.C = 1 and
                        t2.id = t.id + 1
                 );

请注意,如果您的ID以“2”开头,则不会找到“1”。这会找到使用过的第一个id。

答案 2 :(得分:0)

应该可以正常工作:

SELECT MIN(t1.unused_id)
FROM (
    SELECT *, id+1 AS unused_id
    FROM table1
    WHERE A = 3 AND C = 1
    ) AS t1
WHERE 
    t1.unused_id NOT IN (
        SELECT id
        FROM table1
        WHERE A = 3 AND C = 1
    )

正如其他人所说,如果ID从较高的数字开始,它将不会找到1,但您可以轻松检查MIN(id)是否不是1,在这种情况下返回1.

答案 3 :(得分:0)

这个答案只使用一个查询而php正在完成剩下的工作

$query = "
    SELECT DISTINCT(id) 
    FROM t
    WHERE A = 3
    AND C = 1
    ORDER BY id ASC
    ";

$result = $mysqli->query($query); 
$rows = array();
while($row = $result->fetch_assoc()){
   $rows[] = $row['id']; 
}

//rows = Array ( [0] => 1 [1] => 2 [2] => 5 )
$counter = 1;

foreach($rows as $i){
    if($i == $counter){
        $counter ++;
        continue;
    }
    print_r($counter);
    return;
}
print_r($counter);

答案 4 :(得分:-1)

您可以使用简单的SQL查询执行此操作。

Select newID FROM (Select id+1 newID FROM rand WHERE A=3 AND C=1) as newTable WHERE newID NOT IN (Select id newID FROM rand WHERE A=3 AND C=1) LIMIT 1

但是,如果您使用id唯一标识行,请不要手动选择id。使用自动递增列来确定id以避免竞争条件。

编辑:对不起,我的不好。这个新答案将收集每个ID的下一个数字,然后检查该ID是否已用完。如果您删除LIMIT 1,则可以获取所有可用的ID