2011-05-06 65 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

需要明確的是 - 你想匹配的所有對象的數量,或者每個對象計數?預期結果的一個例子會有所幫助。 – 2011-05-06 21:10:58

+0

@OMG小馬:對象的數量,只有一個數字作爲結果。例如:與這些標籤匹配的總共550個對象。 – Tom 2011-05-06 21:13:41

+0

http://www.php.net/manual/en/function.mysql-num-rows.php;這可能有幫助。 編輯:哎呦,以爲這是php,這是無關緊要的 – aph107 2011-05-06 21:15:09

回答

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 2011-05-06 21:27:04

+0

+1不錯!但是,這會計算所有具有tag1 **或** tag2的對象嗎?有沒有辦法讓他們統計那些有兩個? – Konerak 2011-05-07 16:27:41

+0

@Konerak:是 - 將OP問題中提供的GROUP BY和HAVING條款添加到EXISTS查詢中。 – 2011-05-07 19:25:48

相關問題