MySQL查询结果排序时如何分组?

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

例如,我有一个名为“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 |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作为解决方法。