mysql count объединяет двойные результаты - PullRequest
0 голосов
/ 28 ноября 2011

Структура таблицы:

действия идентификатор, имя, tagId

действия Теги идентификатор, название

действия и реакции 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 ?

Проблема в том, что я получаю учетную запись реакции, но она далека от истины. Кажется, что когдау активности есть реакция, она умножает (*) количество фактических реакций на два.

Кто-нибудь знает, где может быть проблема?Может быть, заказ после GROUP BY?

Спасибо

Ответы [ 2 ]

2 голосов
/ 28 ноября 2011

Вы группируете по 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 голос
/ 28 ноября 2011

@ 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 отобразит все теги с разделителем (",").Ваш запрос будет отображать только первый.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...