ORDER BY 第一个 OR 条件为真

ORDER BY first OR condition true

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

+----+-------+-------+--------------+--------------+
| 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 |
+----+-------+-------+--------------+--------------+

我需要 select 行,其中

(`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 都是满足我需要的有效排序,以防万一使解决方案更容易。

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

ORDER BY (foo = bar)

其布尔结果将被类型转换为整数 01,因此如果您首先想要所有 "equal" 值 (1),然后

ORDER BY (foo = bar) DESC

如果您首先想要所有错误 (0) 值,那么

ORDER BY (foo = bar) ASC

如果将 CASE 表达式与 ORDER BY 一起使用会怎么样

ORDER BY 
    CASE 
        WHEN (`mood1_visual`='5c' AND `mood2_visual`='7a') THEN id 
    END