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


Find first unused ID with a condition

我有一个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

并且我想要在CCD_ 2和CCD_。

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

提前感谢!

您可以像@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 开始,这也会起作用

这里有一种使用"不存在"的方法:

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后面找到第一个id。

应该工作正常:

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。

这个答案只使用一个查询,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);

您可以通过一个简单的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。