0

trophies_listとtrophies_wonの2つのテーブルがあります。最初に獲得したすべてのトロフィーをリストし、次に獲得されていないすべてのトロフィーをランダムな順序でリストします。私はあちこちを検索しましたが、運がありませんでした。

私のテーブル...

trophies_won

trophy_idwinner_id
_

trophies_list

trophy_id
trophy_name

明確にするために、すべてのトロフィーをリストしたいのですが、「trophies_won」に表示され、選択した「winners_id」が最初に表示され、残りはランダムな順序で表示されます。

4

1 に答える 1

1

外部結合が必要です。

「勝った」トロフィーが表示される順序を気にしない場合は、次のようにすることができます(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()は、不要なオーバーヘッドを追加している部分を削除できます)。

于 2012-04-22T23:58:46.693 に答える