문제

까다로운 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 */
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top