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',或任何可用于排序的内容
所以我有一个名为 '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',或任何可用于排序的内容