2011-05-06 3 views
2

개체를 여러 태그에 동시에 일치 시켜서 결과 집합을 모든 태그와 일치하도록 "축소"해야하는 경우가 있습니다. 다음과 같은 MySQL 쿼리를 발견했습니다 :MySQL : 모든 태그와 일치하는 개체 수를 반환합니다.

SELECT * 
    FROM OBJECTS o 
    JOIN OBJECTSTAGS ot ON ot.object_id = o.id 
    JOIN TAGS t ON t.id = ot.tag_id 
    WHERE t.name IN ('tag1','tag2') 
GROUP BY o.id 
    HAVING COUNT(DISTINCT t.name) = 2 

... 여기서 2는 일치하는 태그의 수입니다. 그것은 잘 작동합니다.

그러나 개체 자체 대신 개체의 개수를 반환하는 쿼리가 필요합니다. 이 쿼리는 COUNT(*)SELECT에 추가하면 혼란스러워 할 것입니다. 나는 예를 들어 id 만 반환하는 것을 주저하고 매우 많은 수를 추가 할 수 있기 때문에 PHP 카운트를 수행하는 것을 주저합니다. 따라서 MySQL을 사용하여 카운트를 반환하고 싶습니다.

누구든지이 작업을 수행하는 좋은 방법을 제안 할 수 있습니까? 두 개의 질의로 그것을 깨는 것은 받아 들일 수있다.

미리 감사드립니다.

+0

명확하게하기 위해이 - 당신이 일치하는 모든 오브젝트의 수, 또는 개체 당 개수를 원하는? 예상 결과의 예가 도움이됩니다. –

+0

@OMG 조랑말 : 결과의 한 숫자 만 개체 개수. 예 : 총 550 개의 객체가 해당 태그와 일치합니다. – Tom

+0

http://www.php.net/manual/en/function.mysql-num-rows.php; 이것은 도움이 될 수 있습니다. 편집 : whoops는 이것이 PHP라고 생각했지만 이것은 무효입니다 – aph107

답변

2

사용 :

SELECT COUNT(o.*) AS numObjects 
    FROM OBJECTS o 
    WHERE EXISTS (SELECT NULL 
        FROM OBJECTSTAGS ot 
        JOIN TAGS t ON t.id = ot.tag_id 
           AND t.name IN ('tag1','tag2') 
        WHERE ot.object_id = o.id) 
+0

순수한 천재입니다. 나는 당신이 어떻게하는지 알지 못한다. 그러나 그것을 계속해라. – Tom

+0

+1 멋져! 그러나 이것은 tag1 ** OR ** tag2를 가진 모든 객체를 계산합니까? 그 (것)들에는 둘 다 가지고있는 그들을 세는 방법 있는가? – Konerak

+0

@Konerak : 예 - OP의 질문에 제공된'GROUP BY'와'HAVING' 절을 EXISTS 쿼리에 추가하십시오. –

관련 문제