2011-11-28 103 views
0

表结构:MySQL的计数加入双结果

活动 ID,名称,标签识别

activitiesTags ID,标题

activitiesReactions ID,activityId,消息

的现在查询:

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 ? 

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

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

感谢

+1

这是因为你也加入了标签 – munissor

+0

我明白了,所以我应该把它分成2个查询吗?只需在另一个查询中加入标签?还是工会? – user1066101

回答

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将显示所有标签与分隔符( “”)。您的查询将只显示第一个。

+0

没有多个标签,只有多个反应(但我只需要反应的计数而不是实际的反应数据) – user1066101

+0

如果我了解最近的评论,每个活动只会有一个标签。此外,我的查询将获得所有标签,但每行只有一个 – knittl

+0

这个工作,但现在下一步:usersFriends,是的,现在我扔在另一个表中,我需要一个证书用户的所有朋友的活动所以我有另一个表:usersFriends(id,userId,friendUserId)。在我做之前:SELECT A.id etc ... FROM usersFriends UF LEFT JOIN activitiesTags WHERE UF.userId =?那我该怎么做? – user1066101

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,但它仍然会每个活动返回多行。

+0

我可以通过使用联合来修复它,否则我必须在查询之后放置一个foreach循环,并且执行所有活动(可能类似于200),因此对于每个活动,我将不得不再次查询数据库,这将是一个漂亮的业绩损失很大吗? – user1066101

+0

@ user1066101:您试图完成的目标是什么?一个可能性是使用子查询,给我第二个 – knittl

+0

我想要一个活动列表,每个活动可以有一个标签(不需要这么左连接,只有一个),每个活动都可以有反应(不需要,可以是多个每个活动的反应),但我只想获得计数,因为稍后用户将看到活动COUNT,并且如果他们单击活动本身,它将加载ACTUAL反应(因此它不会立即加载所有内容+可以更新它与json实时)。 – user1066101