私はクイズのウェブサイト上で作業しており、ユーザーが直前に行ったクイズに基づいてユーザーが好きなクイズを提案する必要があります。基本的に、彼らがちょうど取ったクイズにタグがある場合、同じタグで別のクイズを引く必要があります。それ以外の場合は、同じカテゴリから別のクイズを引きます。複数のテーブル条件に基づいたMySQLの選択
私が持っているものは、私がそれを望む方法で90%働いていますが、それは私には非常にかさばるようです。 10%は有効ではありません。アクティブなクイズだけを引き出す条件を追加するのを忘れてしまいました。 WHERE q.active = 1
のようなものですが、どこでどのように条件を追加しても、計画どおりに動作しません。私は、条件が追加される前に受け取っていた空のセットまたは同じ結果を取得します。
EDIT:
私は私の最初のWHERE
句にAND q.active = 1
を追加し、同じタグを持つ唯一の他のクイズがあり、それがある場合は... @RiggsFollyによってコメントを読んだ後、
を明確にしますアクティブではないカテゴリ選択ステートメントから結果を受け取る代わりに、空のセットを受け取ります。タグ選択文ではなく、カテゴリ選択文だけにAND q.active = 1
を追加すると、同じタグを持つクイズがない場合でも適切な結果が返されます。
SELECT
IFNULL(q.meta_title, q.title) AS title,
IFNULL(url, title) AS url,
1 istag
FROM tag_index t
LEFT JOIN tag_index ti
ON ti.tag_id = t.tag_id
LEFT JOIN quizzes q
ON q.id = ti.quiz_id
WHERE t.quiz_id = :quiz_id
AND ti.quiz_id != t.quiz_id
UNION ALL
SELECT
IFNULL(q.meta_title, q.title) AS title,
IFNULL(url, title) AS url,
0 istag
FROM category_index c
LEFT JOIN category_index ci
ON ci.category_id = c.category_id
LEFT JOIN quizzes q
ON q.id = ci.quiz_id
WHERE c.quiz_id = :quiz_id
AND ci.quiz_id != c.quiz_id
AND NOT EXISTS
(SELECT 1 FROM tag_index WHERE quiz_id = :quiz_id)
ORDER BY RAND() LIMIT 1
ご意見やご感想をお寄せください。
このSQLは、より多くの行、空白行、インデントで美しくする必要があります。 –
次に、where句に 'AND q.active = 1'を追加してください。 – RiggsFolly
@ Tiberiu-IonuţStanSQL文をきれいにすることは、私の強い訴訟の一つではありません。私はそれを少し読みやすくするために私の投稿を編集しました。提案していただきありがとうございます! – Jay