我有一个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=3
和C=1
。
所以我想只考虑中间3行(因为它们有A = 3和C = 1)并返回3
作为结果(因为它是1,2,5中第一个未使用的id) IDS)。
提前致谢!
答案 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