MySQL 如何在查询结果排序的同时进行分组?

MySQL How to Group While Sorting Query Result?

所以我有一个名为 'films' 的 table,例如这样;

 |id|title |rating|
 |1 |Qwerty|4     |
 |2 |Zxcv  |0     |
 |3 |Asdf  |2     |
 |4 |Jkl   |0     |
 |5 |Uiop  |5     |

所以我想查询 table 并且结果必须按标题排序但是所有评级大于零的数据首先显示,并且还可以限制结果,例如 table, 我想要这样的查询结果;

expected result with LIMIT 5
 |id|title |rating|
 |3 |Asdf  |2     |
 |5 |Uiop  |5     |
 |1 |Qwerty|4     |
 |4 |Jkl   |0     |
 |2 |Zxcv  |0     |

expected result with LIMIT 2
 |id|title |rating|
 |3 |Asdf  |2     |
 |5 |Uiop  |5     |

我试过这个代码,

 (SELECT * FROM films WHERE rating > 0 ORDER BY title) 
 UNION ALL 
 (SELECT * FROM films WHERE rating = 0 ORDER BY title) LIMIT 5

但是 () 中的 order by 在使用 UNION ALL 时被忽略了。

您不应该使用内部联合排序。这将导致发生两层排序。具体原因请看这里:https://dev.mysql.com/doc/refman/5.7/en/union.html

对于您的示例,查找所有电影并按标题和评级对它们进行排序的查询是:

SELECT * FROM films ORDER BY rating DESC, title;

此查询首先抓取所有电影,然后按评分排序(由 DESC 指定,然后按电影标题。与读取查询的顺序相同。

您需要 orderby 合并两个查询后才能正常工作。如果您了解 limit 在这里的工作原理,那么您应该了解 order by 的工作原理

(SELECT * FROM films WHERE rating > 0 ) 
UNION ALL 
(SELECT * FROM films WHERE rating = 0 ORDER BY title) ORDER BY title LIMIT 5

您可以构建一些东西作为声明来订购

你应该可以使用像

这样的东西
mysql> select * from films order by concat(if(rating > 0,0, 1), title);
+-------+--------+
| title | rating |
+-------+--------+
| aaa   |      3 |
| ccc   |      5 |
| bbb   |      0 |
+-------+--------+
3 rows in set (0.00 sec)

在这种情况下,0 或 1 会在排序时添加到标题名称前面,您可以使用 'a' 和 'b',或任何可用于排序的内容