MySQL查询结果排序时如何分组?
例如,我有一个名为“films”的表格MySQL查询结果排序时如何分组?,mysql,sorting,group-by,sql-order-by,union,Mysql,Sorting,Group By,Sql Order By,Union,例如,我有一个名为“films”的表格 |id|title |rating| |1 |Qwerty|4 | |2 |Zxcv |0 | |3 |Asdf |2 | |4 |Jkl |0 | |5 |Uiop |5 | 因此,我想查询表,结果必须按标题排序,但首先显示评级大于零的所有数据,并且可以限制结果,因此,例如,从该表中,我希望查询结果如下所示 expected result with LIMIT 5 |id|title |r
|id|title |rating|
|1 |Qwerty|4 |
|2 |Zxcv |0 |
|3 |Asdf |2 |
|4 |Jkl |0 |
|5 |Uiop |5 |
因此,我想查询表,结果必须按标题排序,但首先显示评级大于零的所有数据,并且可以限制结果,因此,例如,从该表中,我希望查询结果如下所示
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
但是
()
中的按
排序被忽略,在使用联合所有
时,不应使用内部联合排序。这将导致出现两层排序。有关原因的详细信息,请阅读此处:
以您的示例为例,可以查找所有电影并按标题和分级对其进行排序的查询是:
SELECT * FROM films ORDER BY rating DESC, title;
此查询首先获取所有影片,然后按评级排序,先按更高的评级排序(由
DESC
指定,然后由电影标题指定。顺序与查询读取的顺序相同。在联合两个查询之后,您需要orderby
才能工作。如果您了解限制在这里的工作方式,那么您应该了解orderby的工作方式
(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”或任何可用于排序的名称我也尝试过这样做,但结果也与预期不一样,因为它将首先按评级排序,但标题将不按顺序显示。对于我的示例,使用您的查询代码,结果t将是(id)5,1,3,4,2,正如你在上面看到的,我希望结果是3,5,1,4,2,因为标题是按顺序出现的,而所有电影的评级都排在第一位。奥利弗的回答解决了这个问题,谢谢你的回复!我也试过了,但结果也不符合预期,因为最终联合结果将由名称,但不要将顶部结果中评级高于零的所有影片分组,因此对于我的示例,使用您的查询代码,结果将是(id)3,4,1,5,2,正如你在上面看到的那样,我希望结果是3,5,1,4,2,因为标题是按顺序出现的,而对所有电影进行分组,结果排名靠前奥利弗给出了答案,谢谢你的回复!哇,这真的很有效。非常感谢!!非常好的逻辑,使用concat和if作为解决方法。