2016-06-24 4 views
0

私は必要とするデータを正確に返すSQLクエリを持っています。しかし、私はOrder Byに問題があります。私はいくつかの種類のネストされた選択またはグループバイが必要かもしれないと思うが、私はそれらのうちの1つを行ったことがないので、誰かが助けることができるかどうか疑問に思った。データはまずcentre_id、次にlearner_name、次にjourney_centre_startでソートする必要がありますが、centre_idとlearner_nameでソートされているように見え、journey_centre_startのソートは無視されます。by SQL join

Journey_centre_startは、データベースにNULLデフォルト値を持つ日付型です。

SELECT a.learner_id 
    , a.learner_name 
    , a.centre_id 
    , a.learner_status 
    , b.journey_id 
    , c.journey_centre_start 
    FROM learner a 
    JOIN learner_journey b 
    ON a.learner_id = b.learner_id 
    JOIN journey c 
    ON b.journey_id = c.journey_id 
WHERE a.centre_id != 999 
    AND a.learner_status = 'complete' 
ORDER 
    BY a.centre_id ASC 
    , a.learner_name ASC 
    , c.journey_centre_start ASC; 
+0

'journey_centre_start'はどのようなタイプですか? _日付の値を保持するテキストフィールドの場合、おそらく問題が説明されます。 _ – Uueerdo

+0

また、journey_centre_startがNULL可能な列である場合、journey_centre_startでソートする前に、クエリはcentre_id、learner_nameおよびnullの順で返されます。 –

+0

私はチェックしていますし、journey_centre_startはデフォルトとしてNULLを持つ日付型です。それでもソートすることはできますか?ありがとう – JanTay

答えて

1

あなたはjourney_centre_startのNULL値は、リストの一番下になりたいなら、あなたは

SELECT a.learner_id 
, a.learner_name 
, a.centre_id 
, a.learner_status 
, b.journey_id 
, c.journey_centre_start 
    FROM learner a 
JOIN learner_journey b 
    ON a.learner_id = b.learner_id 
JOIN journey c 
    ON b.journey_id = c.journey_id 
WHERE a.centre_id != 999 
AND a.learner_status = 'complete' 
ORDER 
BY a.centre_id ASC 
, a.learner_name ASC 
, CASE WHEN c.journey_centre_start IS NULL THEN 2 ELSE 1 END 
, c.journey_centre_start ASC 
+0

ありがとうございます。すべての学習者は完了しているので、常にjourney_centre_startの日付を持つので、クエリのこの列にはnull値は戻されません。 – JanTay

0

あなたordering`にCASE文を追加することができますが私のポストに答えたみんなにありがとう。それを介して話すことで、実際に私には解決策が非常に簡単だったことが判明しました。 Order By文を次のように変更する必要がありました。 ORDER BY a.centre_id ASC、c.journey_centre_start ASC、a.learner_name ASC。これで私の望む結果が得られました。 お元気ですか。