0

私はかなりトリッキーだと思うことをやろうとしていますが、頭を包むことはできません。ちょっと私を狂わせる。それよりも簡単なはずです。

だから私は2つのテーブルを持っています。ランダムに2点まとめて展示しております。アイテムを選択すると、そのアイテムの投票としてDBに入力され、列にitem ID保存されwin_id、他のアイテムがlst_id列に入ります。次に、さらに 2 つのランダムなアイテムが表示されます。今私の問題は、彼らがアイテムを選択すると、その2つのペアがそのユーザーに再び表示されることを決して望まないことです. ただし、反対票が投じられていない他のアイテムと一緒にアイテムを表示することはできます。これがそれ以来うまくいっていることを願っています。これは私が失敗したクエリです。

SELECT * FROM (SELECT be.media_id FROM battle_entries as be 
WHERE be.btype=1 AND be.mature=1 AND be.mem_id!=1 
AND NOT EXISTS (SELECT * FROM battle_votes as bv 
WHERE bv.win_id = be.media_id AND bv.mem_id=1 AND bv.lst_id=be.media_id)) s ORDER BY RANDOM() LIMIT 2";

win_idと は、lst_idユーザーが選択したペアです。それらが同じユーザーによって Battle_votes テーブルに存在しているが、一緒に表示されていない他のアイテムと一緒にランダムに選択されている場合、これらの 2 つが同じユーザーに再び表示されることは決してありません。

ここにテーブルがあります

バトルエントリー

----------------------------------------------------
| btl_id | mem_id | posted | media_id | active |
----------------------------------------------------

バトル_投票

----------------------------------------------------
| btl_id | mem_id | win_id | lst_id | posted |
----------------------------------------------------

別のスキーマでそれを行うためのより良い方法がある場合、これが不可能な場合はそれも受け入れます。

編集: もう一度説明できるのが最善です。

私のクエリは、ユーザーが投票していない 2 つのランダムなアイテムを選択します。ユーザーがいずれかを選択すると、battle_votes テーブルに新しい行が作成されます。選択されたものは列item IDに入力され、win_id選択されなかったものは列に入力されlst_idます。This is a single row.次にランダム選択を行ってさらに 2 つのアイテムを表示するときに、それらの 2 つを として再度表示したくありませんpairが、それぞれを、battle_votes テーブルに として入力されていない別のアイテムとともに表示できますpair。私はそれが混乱するかもしれないことを知っています。

基本的に、どちらかのアイテムを選択した場合、同じペアが再び一緒に表示されることは望んでいません。

4

2 に答える 2

0

戦闘と勝利に別々のテーブルが必要な場合もあれば、戦闘テーブルに追加の列が必要な場合もあります。2 つの ID を追加しますが、小さい方の ID が常に最初の ID になるようにしてください。

(btl_id, mem_id, id1, id2, win_id, lst_id, ...)

次に、一意の制約/インデックスを にスローします(mem_id,id1,id2)。特にゴミの ORM を使用していない場合は、ドロップすることbtl_idもできます。これは冗長です。

于 2013-08-18T07:17:37.660 に答える