当子查询中有LEFT JOIN和ORDER时,不同的MySQL版本会返回不同的结果

时间:2015-03-21 15:27:30

标签: mysql join left-join

我有这个查询

SELECT r.id, r.name, r.code, rv.votes
FROM tbl_rhythms AS r
LEFT JOIN
  (SELECT rhythm_id, votes
   FROM tbl_songs_rhythms
   WHERE song_id = 1
   ORDER BY votes DESC) AS rv
ON r.id = rv.rhythm_id

...在MySQL 5.6.20中执行时返回此结果

3,Blues,blues,         2
4,Bollero,bollero,     1
1,Ballad,ballad,       NULL
2,Slow,slow,           NULL
5,Slow rocj,slowrock,  NULL
6,Disco,disco,         NULL

但是当我在MySQL 5.5.40-0ubuntu0.14.04.1

中执行相同的查询时
1,Ballad,ballad,       NULL
2,Slow,slow,           NULL
3,Blues,blues,         2
4,Bollero,bollero,     1
5,Slow rock,slowrock,  NULL
6,Disco,disco,         NULL

如您所见,订单搞砸了。

这是MySQL 5.5.40的错误吗?

1 个答案:

答案 0 :(得分:1)

您的问题有不同的结果,但随后您添加“订单搞砸了。”

这显然是正确的,因为外部查询没有order by。而且,最外层 order by中的select确定了排序。你需要在那里下订单:

SELECT r.id, r.name, r.code, rv.votes
FROM tbl_rhythms r LEFT JOIN
     tbl_songs_rhythms rv
     ON r.id = rv.rhythm_id AND rv.song_id = 1
ORDER BY rv.votes DESC;

这也应该使查询更有效率,因为它没有实现子查询,它可以在tbl_songs_rhythms(rhythm_id) join上使用in dex。

至于为什么balad,balad在一个案例中会NULL而在另一个案例中会1 - 我认为这将是一个数据问题,与此结构无关查询。