2012-02-15 27 views
2

在下面的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 
+3

它正确排序,因为内部查询正在返回日期STRING,而不是日期FIELD。 – 2012-02-15 20:58:51

+0

你有看起来像一个小错误,可能无关紧要,但仍值得指出。您在第一个内部查询中选择了“resume_id AS id”,但在第二个查询中仅选择了“profile_id”。这应该是'profile_id AS id'。在你的情况下,你没有使用id,所以它没关系,但如果你最终使用id,可能是一个令人讨厌的bug。在第二个查询中,您也只是选择''profile''而不是''profile'AS type''。 (我在发布的答案中做出了这些修复) – 2012-02-15 21:13:37

回答

4

它是对它们进行排序为字符串,因为你已经转换日期使用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

1

它订购你的格式化的日期字符串为字符串,并想将它们顺序日期。我会直接订购date_mod,然后转换SELECT条款中的输出。