ORDER BY问题没有用子选择正确排序
问题描述:
在下面的SQL语句中,结果按顺序返回。如果他们按照升序或降序排列,这将是有道理的,但似乎这里没有秩序。ORDER BY问题没有用子选择正确排序
任何有关为什么ORDER BY函数未按'日期'别名排序的见解将非常感激。
SQL语句:
SELECT id, date, type
FROM (SELECT resume_id AS id, DATE_FORMAT(date_mod, '%M %e, %Y') AS date, 'resume' AS TYPE
FROM resumes
WHERE user_id = '$user_id'
UNION ALL
SELECT profile_id, DATE_FORMAT(date_mod, '%M %e, %Y') AS date, 'profile'
FROM profiles
WHERE user_id = '$user_id'
ORDER BY date DESC LIMIT 5) AS d1
ORDER BY date
结果:
Resume was updated on February 14, 2012
Resume was updated on February 15, 2012
Resume was updated on February 15, 2012
Resume was updated on February 9, 2012
Profile was updated on February 9, 2012
答
它是对它们进行排序为字符串,因为你已经转换日期使用DATE_FORMAT
字符串(注意,作为一个字符串“2月15日.. 。“低于”2月9日...“,因为1在”字母表“中出现在9之前)。解决方案是按照date_mod
中的实际日期排序。你可以直接通过刚刚在date_mod
的选择添加和更改订单,这样做:
SELECT id, date, date_mod, type
FROM (
SELECT resume_id AS id,
DATE_FORMAT(date_mod, '%M %e, %Y') AS date,
date_mod,
'resume' AS type
FROM resumes
WHERE user_id = '$user_id'
UNION ALL
SELECT profile_id AS id,
DATE_FORMAT(date_mod, '%M %e, %Y') AS date,
date_mod,
'profile' AS type
FROM profiles
WHERE user_id = '$user_id'
ORDER BY date_mod DESC
LIMIT 5
) AS d1
ORDER BY date_mod
但更妙的是仅由date_mod
在子查询中选择(即简化它没有格式版本),并做最后DATE_FORMAT
在外部查询:
SELECT id, DATE_FORMAT(date_mod, '%M %e, %Y') AS date, type
FROM (
SELECT resume_id AS id, date_mod, 'resume' AS type
FROM resumes
WHERE user_id = '$user_id'
UNION ALL
SELECT profile_id AS id, date_mod, 'profile' AS type
FROM profiles
WHERE user_id = '$user_id'
ORDER BY date_mod DESC
LIMIT 5
) AS d1
ORDER BY date_mod
+0
感谢@Ben,这个概念非常有意义,它基于日期字符串进行排序,而不是date_mod字段。 – jsuissa 2012-02-15 21:17:00
答
它订购你的格式化的日期字符串为字符串,并想将它们顺序日期。我会直接订购date_mod
,然后转换SELECT
条款中的输出。
它正确排序,因为内部查询正在返回日期STRING,而不是日期FIELD。 – 2012-02-15 20:58:51
你有看起来像一个小错误,可能无关紧要,但仍值得指出。您在第一个内部查询中选择了“resume_id AS id”,但在第二个查询中仅选择了“profile_id”。这应该是'profile_id AS id'。在你的情况下,你没有使用id,所以它没关系,但如果你最终使用id,可能是一个令人讨厌的bug。在第二个查询中,您也只是选择''profile''而不是''profile'AS type''。 (我在发布的答案中做出了这些修复) – 2012-02-15 21:13:37