使用多个JOIN和GROUP BY - ORDER BY无法按预期工作

时间:2016-12-13 10:43:57

标签: mysql sql database

SELECT msg.msgFrom, 
       mem.memberID,
       mem.memberFirstName,
       mem.memberLastName,
       msg.msgJobID,
       msg.msgMessage,
       msg.msgRead,
       job.jobDescription 
FROM messages msg JOIN members mem ON msg.msgFrom = mem.memberID 
JOIN jobs job on msg.msgJobID = job.jobID 
WHERE msgTo = ? 
GROUP BY msgJobID 
ORDER BY msg.msgRead DESC

我的MySQL语句中的ORDER BY似乎不起作用。只是想知道是否有人可以帮助我。

由于

3 个答案:

答案 0 :(得分:3)

您在这里无缘无故地使用分组。 GROUP BY用于汇总(SUMMAXMIN等)。

由于您不必要的分组,您无法按照您使用的字段进行排序。

另外,定义您的联接类型(良好实践)

请改为尝试:

SELECT msg.msgFrom, 
       mem.memberID,
       mem.memberFirstName,
       mem.memberLastName,
       msg.msgJobID,
       msg.msgMessage,
       msg.msgRead,
       job.jobDescription 
FROM messages msg 
INNER JOIN members mem 
  ON msg.msgFrom = mem.memberID 
INNER JOIN jobs job 
  on msg.msgJobID = job.jobID 
WHERE msgTo = ? 
ORDER BY msgJobID, msg.msgRead DESC -- Use 2x order by's

答案 1 :(得分:1)

只是为了说明一个群体的影响, 给定

MariaDB [sandbox]> select * from person;
+-----------+-------+
| person_id | name  |
+-----------+-------+
|         1 | Test1 |
|         2 | Test2 |
|         3 | Test3 |
+-----------+-------+
3 rows in set (0.00 sec)

MariaDB [sandbox]> select * from personroles;
+-----------+---------+
| person_id | role_id |
+-----------+---------+
|         1 | 1       |
|         1 | 2       |
|         2 | 3       |
|         2 | 1       |
|         3 | 1       |
+-----------+---------+
5 rows in set (0.00 sec)

on role_id上​​的一组返回3行(而不是6行),并且在代码的任何2次执行中,select语句中的其他列不能保证相同。
所以例如

MariaDB [sandbox]> select p.person_id,p.name,pr.role_id
    -> from person p
    -> join personroles pr on pr.person_id = p.person_id
    -> group by pr.role_id ;
+-----------+-------+---------+
| person_id | name  | role_id |
+-----------+-------+---------+
|         1 | Test1 | 1       |
|         1 | Test1 | 2       |
|         2 | Test2 | 3       |
+-----------+-------+---------+
3 rows in set (0.00 sec)

我怀疑你只需要JohnHC建议的订单。

答案 2 :(得分:0)

根据documentation

  

[...]如果[selected]列在功能上不依赖于GROUP BY   列[...]服务器可以自由选择每个组中的任何值,所以   除非它们相同,否则所选择的值是不确定的   可能不是你想要的。此外,选择价值观   通过添加ORDER BY子句不会影响每个组。   结果集排序在选择值和ORDER BY后发生   不会影响服务器选择的每个组中的哪个值。

我建议您在服务器上启用ONLY_FULL_GROUP_BY,以使您的开发符合ANSI标准。它将节省您将来的时间,因为您的查询和您的SQL技能将在不同的dbms实现上变得更加可移植。