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