2014-09-21 3 views
2

я написал следующее присоединиться запрос для получения отчета с помощью агрегатных функциистранные MySQL присоединиться результаты запроса с агрегатными функциями

SELECT users.id, SUM(orders.totalCost) AS bought, COUNT(comment.id) AS commentsCount, COUNT(topics.id) AS topicsCount, COUNT(users_login.id) AS loginCount, COUNT(users_download.id) AS downloadsCount 
FROM users 
LEFT JOIN orders ON users.id=orders.userID AND orders.payStatus=1 
LEFT JOIN comment ON users.id=comment.userID 
LEFT JOIN topics ON users.id=topics.userID 
LEFT JOIN users_login ON users.id=users_login.userID 
LEFT JOIN users_download ON users.id=users_download.userID 
GROUP BY users.id 
ORDER BY bought DESC 

, но я не знаю, почему я получаю следующий выход?

результат совокупных функций умножается друг на друга !!!

Я не знаю почему?

, например, для последней строки я ожидал следующий результат

821 | 48000 | 63 | 0 | 10 | 10 

enter image description here

результат выполнения EXPLAIN запроса показаны ниже

enter image description here

+0

Показать ваш ожидаемый результат установлены, а также обеспечить надлежащие DDLS с некоторыми выборкой данных @ [* Sql Fiddle *] (http://sqlfiddle.com/) –

+0

@MKhalidJunaid увидеть ожидаемый результат в моем обновлении. результат столбцов умножается за исключением столбца id –

ответ

2

Одной из причин для этого типа результата будет заключаться в том, что вы используете левые соединения со своей таблицей пользователей, а результирующий набор может содержать дубликат строки для каждого пользователя, так что вы получаете больше, чем ожидаемый счетчик, вы можете использовать DISTINCT в подсчете, чтобы подсчитывать только уникальные ассоциации для каждого пользователя и для суммы totalCost вы можете использовать подзапрос, чтобы иметь сумму для каждого пользователя без повторяющиеся значения для порядков пользователя

SELECT 
    u.id, 
    COALESCE(o.bought,0) bought 
    COUNT(DISTINCT c.id) AS commentsCount, 
    COUNT(DISTINCT t.id) AS topicsCount, 
    COUNT(DISTINCT ul.id) AS loginCount, 
    COUNT(DISTINCT ud.id) AS downloadsCount 
FROM users u 
LEFT JOIN (SELECT 
      userID, 
      SUM(totalCost) bought 
      FROM orders 
      WHERE payStatus=1 
      GROUP BY userID) o 
ON u.id=o.userID 
LEFT JOIN `comment` c ON u.id=c.userID 
LEFT JOIN topics t ON u.id=t.userID 
LEFT JOIN users_login ul ON u.id=ul.userID 
LEFT JOIN users_download ud ON u.id=ud.userID 
GROUP BY u.id 
ORDER BY bought DESC 
+0

Большое вам спасибо, это сработало;) если вы объясните больше, почему результат содержит повторяющиеся строки? (простыми словами), я действительно ценю это. –

+0

@MohammadMasoudian позволяет взять пример, если у пользователя 1 есть 3 комментария, тогда с левым соединением будет 3 строки на пользователя, а затем еще одно соединение слева с таблицей тем, и у пользователя есть 5 тем, эти три строки будут соединены с 5 строками и в результате 15 рядов на пользователя с дублированными строками для этой цели, я рассчитал сумму в подборе и подсчет с четкими, надеюсь, это имеет смысл :) –

Смежные вопросы