mysql count join double结果

时间:2011-11-28 13:58:37

标签: mysql join

表格结构:

活动 id,name,tagId

activitiesTags id,title

activitiesReactions id,activityId,message

现在的查询:

SELECT A.id as activityId, A.name, A.tagId, T.id, T.title, COUNT(R.id)
FROM activities A
LEFT JOIN activitiesTags T
ON A.tagId = T.id
LEFT JOIN activitiesReactions R
ON R.activityId = A.id
GROUP BY A.id
ORDER BY A.id DESC
LIMIT ?

问题是我得到了一个反应计数,但它远非如此,似乎当某个活动有反应时,它会将实际反应的数量乘以(*)两倍。

有谁知道问题可能在哪里?也许是GROUP BY之后的ORDER BY?

由于

2 个答案:

答案 0 :(得分:2)

您正在activities.id(或activitiesReaction.activityId分组,无论您使用哪种方式)。通过加入您的代码表,您将获得与给定活动匹配的每个代码的新行。您的计数不会加倍,而是乘以每项活动的标签数量。

您希望使用子查询将标记添加到以前的结果集中:

SELECT *
FROM (
    SELECT A.id as activityId, A.name, A.tagId, T.id, T.title, COUNT(*)
    FROM activities A
    LEFT JOIN activitiesReactions R
    ON R.activityId = A.id
    GROUP BY A.id
    ORDER BY A.id DESC
    LIMIT ?
) a
LEFT JOIN activitiesTags T
ON a.tagId = T.id

这会为您提供正确的COUNT,但每次活动仍会返回多行。

答案 1 :(得分:1)

@knittl

对您的查询进行了一些修改:

SELECT a.* , group_concat(T.title)
FROM ( 
    SELECT A.id as activityId, A.name, A.tagId, T.id, T.title, COUNT(R.id) 
    FROM activities A 
    LEFT JOIN activitiesReactions R 
    ON R.activityId = A.id 
    GROUP BY A.id 
    ORDER BY A.id DESC 
    LIMIT ? 
) a 
LEFT JOIN activitiesTags T 
ON a.tagId = T.id 

group_concat将显示带分隔符(“,”)的所有标记。您的查询将仅显示第一个。