表格结构:
活动 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?
由于
答案 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
将显示带分隔符(“,”)的所有标记。您的查询将仅显示第一个。