2014-02-10 3 views
1

태그 시스템 (cds, cds_tags, tags)을 만들기 위해 3 개의 테이블이 있으며 사용자가 제출 한 특정 태그 목록이있는 행을 표시하려고합니다. 올바른 결과를 얻을 수는 있지만 사용자의 검색 태그와 일치하는 태그 만 표시합니다.태그를 검색하고 모두 표시

SELECT cds.TITLE , GROUP_CONCAT(tags.TAG_NAME SEPARATOR ',') 
FROM cds 
JOIN cds_tags ON cds_tags.CD_ID = cds.ID 
JOIN tags ON tags.TAG_ID = cds_tags.TAG_ID 
WHERE tags.TAG_NAME IN (*the tags the user searches for*) 
GROUP BY cds.TITLE 
HAVING COUNT(DISTINCT tags.TAG_NAME) = *the count of searching tags* 

나는 사용자가 검색하는 CD뿐만 아니라 모든 태그를 얻고 자한다.

업데이트 : WHERE 절을 변경하여 Linger가 제안한 태그가있는 모든 cds.ID를 찾으면 처음부터 문제가 해결되어 CD에 대한 모든 태그를 얻을 수 있지만, 모든 태그가 CD에 링크 된 결과를 얻지 못합니다. 예 : 태그를 사용하여 CD를 검색 할 때 : rock, house .. 나는 2 개의 태그가있는 모든 CD와 이전의 태그 중 1 개 이상을 연결합니다. 그것을 고칠 수있는 방법이 있습니까?

업데이트 2 : 문제는 하위 쿼리 외부에 HAVING COUNT()입니다. 오른쪽 쿼리는

SELECT cds.TITLE , GROUP_CONCAT(tags.TAG_NAME SEPARATOR ',') 
FROM cds 
    JOIN cds_tags ON cds_tags.CD_ID = cds.ID 
    JOIN tags ON tags.TAG_ID = cds_tags.TAG_ID 
WHERE cds.ID IN 
(
    SELECT sct.CD_ID 
    FROM cds_tags sct 
    JOIN tags st ON st.TAG_ID = sct.TAG_ID 
    WHERE st.TAG_NAME IN (*the tags the user searches for*) 
    HAVING COUNT(DISTINCT tags.TAG_NAME) = *the count of searching tags* 
    GROUP BY sct.CD_ID 

) 
GROUP BY cds.TITLE 

답변

0

얼마나 절은 그들에 링크 된 태그가 모든 cds.ID의를 찾기 위해 당신의 WHERE 변경에 대한 :

SELECT cds.TITLE , GROUP_CONCAT(tags.TAG_NAME SEPARATOR ',') 
FROM cds 
    JOIN cds_tags ON cds_tags.CD_ID = cds.ID 
    JOIN tags ON tags.TAG_ID = cds_tags.TAG_ID 
WHERE cds.ID IN 
(
    SELECT sct.CD_ID 
    FROM cds_tags sct 
    JOIN tags st ON st.TAG_ID = sct.TAG_ID 
    WHERE st.TAG_NAME IN (*the tags the user searches for*) 
) 
GROUP BY cds.TITLE 
HAVING COUNT(DISTINCT tags.TAG_NAME) = *the count of searching tags* 
+0

귀하의 빠른 응답 주셔서 대단히 감사합니다! –

관련 문제