2012-02-15 12 views
2

以下のSQL文では、結果が順不同で返されます。彼らが昇順または降順であった場合、それは理にかなっていますが、ここには順序がないようです。ORDER BYの問題がサブ選択で正しくソートされない

ORDER BY関数が 'date'エイリアスでソートされていない理由についての洞察は非常に高く評価されます。

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

内部クエリが日付FIELDではなく日付STRINGを返しているため、正しくソートされています。 –

+0

あなたは小さなバグのように見えますが、おそらく重要ではありませんが、それでも指摘する価値があります。最初の内部クエリで 'resume_id AS id'を選択していますが、2番目のクエリでは' profile_id'だけを選択しています。これは 'profile_id AS id'でなければなりません。あなたの場合、あなたはIDを使用していないので、それは問題ではありませんが、IDを使用して終了した場合、行の下の迷惑なバグかもしれません。 2番目のクエリでは、 '' profile ''の代わりに '' profile''を選択するだけです。 (私が投稿した答えでこれらの修正を行いました) –

答えて

4

あなたがDATE_FORMATを使用して文字列に日付を変換してきたので、それは「文字列として2月15日のことに注意してください(文字列としてそれらを並べ替えています。.. 。 "は" 2月9日 "よりも低くなります。なぜなら、1は"アルファベット "の9の前に来るからです)。解決策は、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_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

1

それは文字列としてあなたのフォーマットされた日付文字列を注文だ、とあなたが日付としてそれらを注文したいです。 date_modで直接注文してから、SELECT節の出力を変換します。

関連する問題