MySQL JOIN с 3 таблицами и COUNT () не работает - PullRequest
2 голосов
/ 28 июля 2010

У меня проблема с оператором MySQL.Мне нужен запрос, который подсчитывает количество комментариев и количество тем, созданных пользователем.Моя структура таблицы выглядит примерно так:

Table 'users'
-------------
user_id
user_name
...

Table 'topics'
--------------
topic_id
topic_user_id
...

Table 'topiccomments'
---------------------
topiccomment_id
topiccomment_user_id
...

До сих пор мне удавалось создать этот запрос:

SELECT 
    u.user_id, 
    u.user_name,
    COUNT(t.topic_user_id) as topic_count,
    COUNT(tc.topiccomment_user_id) as topiccomment_count
FROM 
    users as u
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id
    JOIN topics as t ON u.user_id = t.topic_user_id
WHERE 
    u.user_id = t.topic_user_id AND
    u.user_id = tc.topiccomment_user_id 
GROUP BY 
    u.user_id

Этот запрос выполнен, но 'topic_count' и 'Значения topiccomment_count 'абсолютно неверны, и я не совсем понимаю, почему.

Я надеялся, что кто-нибудь здесь сможет мне помочь?

Ответы [ 5 ]

5 голосов
/ 28 июля 2010

изменить на

COUNT(DISTINCT t.topic_id) as topic_count,
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count

Это будет подсчитывать количество отдельных тем и комментариев к темам, которые соответствуют идентификатору пользователя.Раньше вы подсчитывали количество строк в перекрестном произведении тем и комментариев к тем для данного пользователя.

Если это работает в вашей ситуации, я бы реорганизовал это в два запроса, один для подсчета тем иодин для topic_comments, так как это будет более эффективным.

2 голосов
/ 28 июля 2010

Прежде всего, вы можете удалить все предложение WHERE.В этом нет необходимости, поскольку вы уже позаботились об этом в соединениях.

Чтобы устранить эту проблему, используйте это в предложении SELECT вместо текущих операторов COUNT, которые у вас есть:

COUNT(DISTINCT t.topic_id) as topic_count,
COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count

Вы пытаетесь подсчитать количество тем или комментариев к темам.Не количество пользователей (которое всегда должно быть 1).

2 голосов
/ 28 июля 2010

быстрый выстрел: попробуйте заменить счет (поле) на счет (отличное поле)

1 голос
/ 28 июля 2010

Соединения, вероятно, возвращают декартово произведение таблиц topiccomments и topics, потому что между их отношениями нет ограничений, что может объяснить, почему вы получаете высокий счет.

Один простой способЧтобы решить эту проблему, используйте коррелированные подзапросы:

SELECT  u.user_id, 
        u.user_name,
        SELECT (COUNT(*) FROM topics t WHERE t.id = u.id),
        SELECT (COUNT(*) FROM topiccomments tc WHERE tc.id = u.id)
FROM    users u;

Вы также можете использовать COUNT(DISTINCT t.topic_id) и COUNT(DISTINCT tc.topiccomment_id) в исходном запросе, как предлагают некоторые другие ответы.Фактически, это может оказаться более эффективным с точки зрения производительности.

0 голосов
/ 28 июля 2010

Вы должны подсчитывать тему и идентификаторы комментариев, а не user_ids комментария / темы.

SELECT 
    u.user_id, 
    u.user_name,
    COUNT(DISTINCT t.topic_id) as topic_count,
    COUNT(DISTINCT tc.topiccomment_id) as topiccomment_count
FROM 
    users as u
    JOIN topiccomments as tc ON u.user_id = tc.topiccomment_user_id
    JOIN topics as t ON u.user_id = t.topic_user_id
GROUP BY 
    u.user_id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...