在MySQL中,我试图从数据库中检索一行,除非它不存在,在这种情况下,我希望它检索第二行。我已经写出了代码,但由于某种原因,它正在检索这两行。如果没有找到第一行,它将检索第二行。所以不管怎样,它总是检索第二行。
SELECT *
FROM `members`
WHERE
`id` = 49
or `id` = 0
我在具有不同列的不同数据库上尝试了许多变体(when/then/else等),它总是检索这两行。
我如何才能只检索到我需要的一行?还有,有人能向我解释一下它为什么会这样做吗?
您首先想要哪一行?id = 49
?您可以尝试使用mysql的ORDER BY
和LIMIT
来获得您想要的结果。例如,如果你想先得到id 49,你可以做:
SELECT * FROM members WHERE id = 49 OR id = 0 ORDER BY FIELD(id, 49, 0) LIMIT 1
这将按字段id
对结果进行排序,但将结果限制为仅一行。因此,如果不存在具有id = 49
的行,它仍然会得到列表中的第一行,即id = 0
另一种方法是使用带有一些逻辑的union all
进行验证:
SELECT m.*
FROM members m
WHERE id = 49
UNION ALL
SELECT m.*
FORM members m
WHERE id = 0 AND NOT EXISTS (SELECT 1 FROM member m2 WHERE m2.id = 49);
在某些情况下,这可能会稍微快一点。
您可以通过语句订购:
ORDER BY (id = 49) DESC
DESC
,因为(id = 49)
是您想要的第一行的1
。
如果您只想要1,LIMIT 1
。如果你想要更多,你可以将这些链接到自定义排序中:
ORDER BY (id = 14) DESC, (id = 43) DESC, (id = 49) DESC LIMIT 3
等等。
很容易记住。