我喜欢在MySQL上优先选择一行。我不知道是否可能,但请看下面的例子:
id name
1 John
2 Doe
3 Mary
4 Jhonny
假设我不知道ID,但由于特定原因,我需要按优先级选择:3,2,1 ......在这种情况下,将选择MARY(#3)。但如果我需要按顺序5,2,1选择,将选择DOE(#2)。
好的,我可以使用IN(5,2,1)来实现。问题是,如果我没有任何结果(如IN(5,6,7)),我至少需要一行(无所谓)。
例如:选择5,6,7 ......没有找到...然后,选择第一个找到的(如JOHN)。
有可能吗?
再见!
编辑:我刚想到了这个解决方案,但我不知道应该有多快,但效果很好。接受一个没有人输的更好基准的回复。
ORDER BY FIND_IN_SET(`id`, '5,6,7') DESC
答案 0 :(得分:6)
SELECT *
FROM your_table
ORDER BY
(CASE id
WHEN 5 THEN 1
WHEN 6 THEN 2
WHEN 7 THEN 3
ELSE id+10
END)
LIMIT $some_limit;
诀窍是在order by
因此,匹配id为5将赋予优先级1,
匹配id为6将赋予优先级2,
匹配id为7将赋予优先级3,
否则,最少id将返回
假设您使用无符号作为ID
答案 1 :(得分:0)
首先你需要将ID列重新映射到命令列,让我们在特殊联合的帮助下完成(第一列是你的id,第二列是命令指令):
SELECT 5 as ID, 1 as ord
UNION ALL SELECT 2 , 2
UNION ALL SELECT 1 , 3
清楚吗? 如果是这样 - 让我们做完全的例子:
SELECT m.* from MyTable m
LEFT OUTER JOIN (
SELECT 5 as ID, 1 as ord
UNION ALL SELECT 2 , 2
UNION ALL SELECT 1 , 3
) o ON m.ID = o.ID
ORDER BY COALESCE(o.ord, 100)
答案 2 :(得分:0)
SELECT U.username,id
来自tbluser U.
ORDER BY FIND_IN_SET(username
,'Tester')DESC,用户名ACS
这个优先级(首先给出)“Tester”,然后对它进行排序A-Z