外部結合が必要です。
「勝った」トロフィーが表示される順序を気にしない場合は、次のようにすることができます(winner_id
勝っNULL
ていないトロフィーの場合NULL
は、他のすべての結果が降順で「後に」順序付けられるためです)。)::
SELECT * FROM
trophies_list
NATURAL LEFT JOIN trophies_won
ORDER BY winner_id DESC, RAND();
もちろん、「勝てなかったトロフィーはすべてランダムな順序にする必要がある」と言った場合、単に順序を気にしないという意味であれば、末尾の「, RAND()
」を省略できます。
アップデート
あなたのコメントに応えて、私はあなたが実際にもっと次のようなものを探していると思います:
SELECT trophies_list.*, NOT ISNULL(trophies_won.winner_id) AS won FROM
trophies_list
LEFT JOIN trophies_won ON (
trophies_won.trophy_id = trophies_list.trophy_id
AND trophies_won.winner_id = 43
)
ORDER BY won DESC, RAND();
目的の基準に外部結合を実行するON
ことで、その基準に一致するトロフィーと一致しないトロフィーのリストの中から特定できます。この場合、指定された勝者が獲得したトロフィーと獲得していないトロフィーはどれですか。
次に、このORDER BY
句は、勝ったトロフィーが最初に表示され、次に勝ったトロフィーが表示されないように結果が順序付けられるようにします。これらの層内では、順序はランダム化されます(ここでも、順序を気にしない場合, RAND()
は、不要なオーバーヘッドを追加している部分を削除できます)。