在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
然后它确实有效。为什么顶级的不起作用,并且是解决这个问题的最佳方法的第二种方式?
由于
答案 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 如果该语句保证返回的结果集符合您的规范,那么这是一种可行的方法。 (一个缺点是内联视图查询的开销。)
但我强烈怀疑第二种说法实际上只是掩盖了问题,而不是真正解决问题。