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

相关问题