MySql order by子句不起作用

时间:2014-12-22 23:16:53

标签: mysql sql-order-by

在mysql查询中我使用order by,但它不起作用。

当我这样做时

SELECT t.id,t.user_id,t.title,c.comment,d.has_answer,IF(c.id IS NULL, t.date_created, d.recent_date) recent_date,MIN(i.id) image_id 
  FROM threads t 
  LEFT JOIN comments c ON c.thread_id = t.id
  INNER JOIN (
        SELECT  thread_id, MAX(date_sent) recent_date, MAX(is_answer) has_answer
        FROM    comments
        GROUP   BY thread_id
    ) d ON c.id IS NULL OR (d.thread_id = c.thread_id AND d.recent_date = c.date_sent)
  LEFT JOIN thread_images i ON t.id = i.thread_id
  WHERE t.user_id = t.user_id
  GROUP BY t.id 
  ORDER BY d.recent_date DESC 
  LIMIT 0, 10

它没有正确排序。但如果我这样做:

SELECT *
FROM (
SELECT t.id,t.user_id,t.title,c.comment,d.has_answer,IF(c.id IS NULL, t.date_created, d.recent_date) recent_date,MIN(i.id) image_id 
  FROM threads t 
  LEFT JOIN comments c ON c.thread_id = t.id
  INNER JOIN (
        SELECT  thread_id, MAX(date_sent) recent_date, MAX(is_answer) has_answer
        FROM    comments
        GROUP   BY thread_id
    ) d ON c.id IS NULL OR (d.thread_id = c.thread_id AND d.recent_date = c.date_sent)
  LEFT JOIN thread_images i ON t.id = i.thread_id
  WHERE t.user_id = t.user_id
  GROUP BY t.id 

  LIMIT 0, 10) qwerty
ORDER BY recent_date DESC 

然后它确实有效。为什么顶级的不起作用,并且是解决这个问题的最佳方法的第二种方式?

由于

2 个答案:

答案 0 :(得分:1)

SELECT t.id,t.user_id,t.title,c.comment,d.has_answer,IF(c.id IS NULL, t.date_created, d.recent_date) recent_date,MIN(i.id) image_id 
  FROM (threads t 
  LEFT JOIN comments c ON c.thread_id = t.id
  INNER JOIN (
        SELECT  thread_id, MAX(date_sent) recent_date, MAX(is_answer) has_answer
        FROM    comments
        GROUP   BY thread_id
    ) d ON c.id IS NULL OR (d.thread_id = c.thread_id AND d.recent_date = c.date_sent)
  LEFT JOIN thread_images i ON t.id = i.thread_id
  WHERE t.user_id = t.user_id
  GROUP BY t.id 
  LIMIT 0, 10) x
  ORDER BY d.recent_date DESC 

答案 1 :(得分:1)

这两个陈述是按两种不同的方式排序的。

第二个语句按SELECT列表中的表达式结果排序。

但第一个语句指定由内联视图recent_date返回的值d排序;如果您从 d. 前面删除“ recent_date ”,那么ORDER BY子句将引用分配给表达式的别名在SELECT列表中,如第二个语句那样。

因为recent_date是SELECT列表的表达式的别名,所以这两个是等价的:

ORDER BY recent_date

ORDER BY IF(c.id IS NULL, t.date_created, d.recent_date)
                                          ^^

但这些与以下方面有很大不同:

ORDER BY d.recent_date
         ^^

请注意,GROUP BY子句的非标准使用可能会掩盖查询丢弃的recent_date的某些值。 GROUP BY子句的这种用法是SQL标准的MySQL扩展;大多数其他关系数据库会在此语句中引发错误。通过启用ONLY_FULL_GROUP_BY SQL模式,可以让MySQL抛出相同类型的错误。


第二种陈述是解决这个问题的最佳方法吗?

A 如果该语句保证返回的结果集符合您的规范,那么这是一种可行的方法。 (一个缺点是内联视图查询的开销。)

但我强烈怀疑第二种说法实际上只是掩盖了问题,而不是真正解决问题。