0

我有一个具有以下结构的 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

我想选择第一个未使用的 id whereA=3C=1.

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

提前致谢!

4

5 回答 5

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 开始,这也会起作用

于 2013-08-21T10:56:01.570 回答
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);
于 2013-08-21T11:28:24.970 回答
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。

于 2013-08-21T11:04:08.087 回答
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 之后的第一个 ID。

于 2013-08-21T10:45:23.163 回答
-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

于 2013-08-21T10:45:37.057 回答