1

これは面白そうです。

users3つのテーブル、、itemsおよび結合テーブルを想定しますusers_items。後者はusers.idsをitems.idsにリンクします。ペア(、 )を含む行がテーブルにある場合、ユーザーUはアイテムを所有していると言います。Iusers_itemsU.idI.id

さて、特定のユーザーがまだ所有していないアイテムをランダムに選択するにはどうすればよいですか?

最も実行可能な解決策は次のようです。

  1. すべてのアイテムを収集しますid
  2. idユーザーが所有するアイテムのsを収集しますU
  3. id#1で生成されたセットからステップ#2のすべてのsを削除します
  4. 結果のセットからランダムな要素を選択します(些細な)

これが唯一の正しい方法ですか?最適ですか?これが頻繁に使用される機能であると仮定しましょう。そして、各テーブルの要素の数は膨大です。

楽しいアイデア、考えはありますか?

4

2 に答える 2

2

左結合を使用して、ユーザーが現在所有していないアイテムIDのリストを生成するには、次のようにします。

SELECT i.id
FROM items i 
LEFT JOIN users_items ui ON ( i.id = ui.item_id AND ui.users_id = 2 )
WHERE ui.item_id IS NULL;

ここから、結果セットから要素の1つをランダムに選択できます。

于 2012-05-23T23:07:16.527 に答える
0

これが1つのクエリで実行されるように、SQLをランダム化してみませんか。mysql、tsql、または他の何かを使用しているかどうかはわかりませんが、この質問はを使用して言及しORDER BY RAND() LIMIT 1ました。このようなものはどうですか:

select i.itemName
from users as s
left join items as i
    on i.id not in 
        (select ui.itemID from users_items as ui where ui.userID = u.id)
order by rand()
limit 1
于 2012-05-23T23:07:18.237 に答える