2011-09-05 59 views
1

我喜欢在MySQL上优先选择一行。我不知道这是否是可能的,但看到下面的例子: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

优先级顺序可以是类似于“2,4,1,3”并产生Doe的结果吗?或者'Jhonny'是一个可接受的结果? –

+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

所以,5匹配的ID将给予优先考虑1,
的6匹配的ID将给优先级2,
匹配id为7会给优先级3,
否则,最少id将返回

假设你使用无符号的ID

+0

但是,如果您在列表中没有任何ID,并且您的$ some_limit是10,您将获得前10个结果,而不仅仅是他想要的结果。 –

+0

OP至少要一行,所以它仍然会匹配 – ajreal

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) 
0

SELECT U.username,ID FROM tbluserü ORDER BY FIND_IN_SET(username, '测试')DESC,用户名ACS

这个优先级(使首先)“测试器”,然后对其进行排序AZ