ORDER BY first OR条件为true

时间:2016-10-28 21:38:57

标签: mysql sql-order-by

我在MySQL 5.6+数据库中有以下表格

+----+-------+-------+--------------+--------------+
| id | mood1 | mood2 | mood1_visual | mood2_visual |
+----+-------+-------+--------------+--------------+
|  1 |     5 |     7 |           5c |           7a |
|  2 |     5 |     7 |           5b |           7b |
|  3 |     5 |     7 |           5c |           7d |
|  4 |     5 |     8 |           5a |           8a |
|  5 |     5 |     7 |           5c |           7a |
|  6 |     5 |     8 |           5b |           8a |
+----+-------+-------+--------------+--------------+

我需要选择

(`mood1_visual`='5c' AND `mood2_visual`='7a') OR 
  (`mood1`=5 AND `mood2`=7 AND (`mood1_visual`<>'5c' OR `mood2_visual`<>'7a'))

在上面的示例中,那些将是行1,2,3和5.但是我需要将它们与其他WHERE子句的第一部分匹配,然后我需要它们排序1,5,2,3,因为第1行和第5行满足WHERE子句的第一部分

(`mood1_visual`='5c' AND `mood2_visual`='7a')

我如何在ORDER BY条款中说明这一点?有什么像

ORDER BY THE ONES THAT MATCH CONDITION FIRST THEN THE OTHERS ?

请注意,5,1,2,3或1,5,3,2或5,1,3,2都是满足我需求的有效排序,以防万一使解决方案更容易。

2 个答案:

答案 0 :(得分:1)

MySQL可以order by任意表达式,例如

ORDER BY (foo = bar)

布尔结果将是整数01的类型转换,所以如果你想要所有的&#34;等于&#34;首先是值(1),然后是

ORDER BY (foo = bar) DESC

如果你想要所有的假(0)值,那么

ORDER BY (foo = bar) ASC

答案 1 :(得分:1)

如果您使用CASE表达式ORDER BY

,该怎么办?
ORDER BY 
    CASE 
        WHEN (`mood1_visual`='5c' AND `mood2_visual`='7a') THEN id 
    END