저는 퀴즈 웹 사이트에서 일하고 있습니다. 사용자가 방금 한 퀴즈를 기반으로 사용자가 좋아할 수도있는 퀴즈를 제안해야합니다. 기본적으로 퀴즈에 나온 태그가 있으면 같은 태그로 다른 퀴즈를 풀어야합니다. 그렇지 않으면 같은 범주에서 다른 퀴즈를 당깁니다.여러 테이블 조건을 기반으로 MySQL을 선택하십시오.
내가 원했던 방식은 내가 원하는 방식으로 90 % 작동하지만, 나에게는 매우 부피가 커 보인다. 작동하지 않는 10 %는 활성화 된 퀴즈 만 가져 오는 조건을 추가하는 것을 잊었습니다. WHERE q.active = 1
과 같은 것이지만 어디서나 내가 어떻게 그 조건을 추가했는지에 관계없이 계획대로 작동하지 않습니다. 조건이 추가되기 전에받은 빈 세트 나 결과를 얻습니다.
편집 : 내가 처음으로 WHERE
절에 AND q.active = 1
를 추가하고 하나의 다른 퀴즈가 동일한 태그로 존재하고 있는지
이
... @RiggsFolly하여 설명을 읽은 후, 명확히하기 not active 카테고리 선택 문에서 결과를받는 대신 빈 집합을받습니다. 동일한 태그를 가진 퀴즈가없는 경우 태그 선택 명령문이 아닌 카테고리 선택 명령문에 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ţStan SQL 문을 매우 아름답게 만드는 것은 분명히 제 강점 중 하나는 아닙니다. 내 글을 좀 더 읽기 쉽게 편집했습니다. 제안 해 주셔서 감사합니다! – Jay