문제
까다로운 SQL 쿼리에 문제가 있습니다.
MySQL 데이터베이스에는 테이블 주제, 태그 및 태그가 있습니다. 동일한 지정된 태그를 공유하는 주제를 가져오고 싶습니다. 예를 들어 ID 1, 2 및 3이있는 3 개의 태그가 있다고 가정 해 봅시다. 태그 1, 2 및 3이 관련된 모든 주제를 가져오고 싶습니다. 주제에는 다른 태그가있을 수 있지만 지정된 모든 태그가 있어야합니다.
plz XD를 생각하도록 도와주세요
편집 :이 질문에서 그룹을 사용하여 솔루션을 찾았습니다. 결합 된 테이블 (SQL)의 모든 항목과 일치하는 행 만 가져 오기더 우아한 솔루션이 있으면 게시하십시오 :)
해결책
JOIN
해결책:
SELECT t.*
FROM topics t
JOIN tags_topics t1 ON (t.id = t1.topicId AND t1.tagId = 1)
JOIN tags_topics t2 ON (t.id = t2.topicId AND t2.tagId = 2)
JOIN tags_topics t3 ON (t.id = t3.topicId AND t3.tagId = 3)
GROUP BY
해결책:
모두 나열해야합니다 t.*
에있는 열 GROUP BY
mySQL 또는 sqlite를 사용하지 않는 한 조항.
SELECT t.*
FROM topics t JOIN tags_topics tt
ON (t.id = tt.topicId AND tt.tagId IN (1,2,3))
GROUP BY t.id, ...
HAVING COUNT(*) = 3;
하위 쿼리 솔루션 :
SELECT t.*
FROM topics t
WHERE t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 1)
AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 2)
AND t.id = ANY (SELECT topicId FROM tags_topics tt WHERE tt.tagId = 3);
수정 GROUP BY
해결책:
단순화합니다 GROUP BY
하위 퀘스트에서 검색을 분리하여 조항.
SELECT t.*
FROM topics t
WHERE t.id IN (
SELECT tt.topicId FROM tags_topics tt
WHERE tt.tagId IN (1,2,3))
GROUP BY tt.id HAVING COUNT(*) = 3
);
다른 팁
SELECT
topic_id
FROM
tags_topics
WHERE
tag_id IN (1,2,3)
GROUP BY
topic_id
HAVING
COUNT(*) > 2 /* or use COUNT(*) = 3 if you know that there cannot be duplicates in the junction table */
제휴하지 않습니다 StackOverflow