Mysql SUM вывод неправильный - PullRequest
1 голос
/ 19 августа 2011

У меня есть запрос типа:

SELECT DISTINCT
g.thumb, h.hotel_name, h.id, COUNT(c.id) as total_comments, SUM(c.rating) AS total_ratings
FROM 
at_hotels h 
LEFT JOIN 
at_gallery g 
ON 
h.id = g.h_id
LEFT OUTER JOIN
at_comments c
ON
h.id = c.h_id AND c.status = '1'
GROUP BY h.id 
ORDER BY h.id DESC LIMIT 5

Запрос работает, кроме SUM (рейтинг).Команда Sum дает больше, чем ожидалось.Я также попробовал команду SUM следующим образом:

--query
(SELECT SUM(rating) FROM at_comments WHERE at_comments.h_id = at_hotels.id) AS total
--more query

, и это тоже не работает.

всего должно быть: 13, но это дает 36. В чем проблема?

Пример данных: (Таблица комментариев)

id h_id rating
----------
1 | 1  |5
----------
2 | 1  |3
----------
3 | 1  |5

Мои таблицы:

Tables

Ответы [ 3 ]

0 голосов
/ 19 августа 2011

Во-первых, потерять DISTINCT - это не нужно.
Во-вторых, отформатируйте ваш запрос, чтобы он был читабельным, как этот вид форматирования:

SELECT
  g.thumb,
  h.hotel_name,
  h.id,
  COUNT(c.id) as total_comments,
  SUM(c.rating) AS total_ratings
FROM at_hotels h 
LEFT JOIN at_gallery g ON h.id = g.h_id -- put join, tablee and on clause on same line
LEFT JOIN at_comments c ON h.id = c.h_id AND c.status = '1' -- removed OUTER: redundant
GROUP BY 1,2,3 
ORDER BY h.id DESC
LIMIT 5;

В-третьих (уже сделано выше), добавьте неагрегированные столбцы к GROUP BY - я предпочитаю использовать числа - это понятнее.

Посмотрите, как это происходит.

0 голосов
/ 22 августа 2011

Я решил эту проблему.

Проблема была в строке рейтинга «ТИП ДАННЫХ».

Тип строки рейтинга был «SET» и значения 1,2,3,4,5.

Я изменил тип данных на TINYINT, записи автоматически изменяются следующим образом:

5 -> 16
3 -> 4
5 -> 16

16 + 4 + 16 = 36

Итак, при суммировании типа данных 'SET' глючит что-то?

0 голосов
/ 19 августа 2011

Это полностью зависит от ваших данных (которые мы не можем видеть), но я бы посоветовал не полагаться на MySQL, чтобы делать «правильные вещи» для вашей группировки, а явно GROUP BY их:

SELECT 
MAX(g.thumb), h.hotel_name, h.id, COUNT(c.id) as total_comments, SUM(c.rating) AS total_ratings
FROM 
at_hotels h 
LEFT JOIN 
at_gallery g 
ON 
h.id = g.h_id
LEFT OUTER JOIN
at_comments c
ON
h.id = c.h_id AND c.status = '1'
GROUP BY h.id, h.hotel_name
ORDER BY h.id DESC LIMIT 5
...