2015-11-13 4 views
2

У меня есть 3 таблицы, называемые магазинами, услугами и рейтингом.SUM() возвращает неправильные значения при использовании левого соединения с GROUP_CONCAT

Магазины имеют

Shops have

Services имеют более чем один услуги для магазинов enter image description here

Рейтинг имеет рейтинг магазинов enter image description here

Мне нужно, чтобы получить подробную информацию магазин с услугами, а также рейтинг в одном запросе.

Я сделал этот запрос

select shops.*, count(distinct rating.id) as rating_count, 
sum(rating.rating) as total_rating, 
GROUP_CONCAT(distinct services.servicename SEPARATOR " <=> ") as servicename 
from shops 
LEFT JOIN rating on rating.shop_id = shops.id 
LEFT JOIN services on services.shop_id = shops.id 
group by shops.id 

возвращает enter image description here

Но shop1 имеет total_rating 21. Но это показывает 42.

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

Проверить это fiddle

+0

Почему ваши сервисные имена называются 'shop1',' shop2' и т. Д.? Это делает ваш вопрос очень запутанным. –

+0

@TimBiegeleisen Исправлено. – RaGu

+0

Возможно, это может быть более элегантно написано следующим образом: http://sqlfiddle.com/#!9/ece82/29 – Strawberry

ответ

0
select q1.id, q1.shopname, q1.rating_count, q1.total_rating, 
GROUP_CONCAT(distinct services.servicename SEPARATOR " <=> ") as servicenamefrom 
FROM 
(select shops.*, count(distinct rating.id) as rating_count, 
sum(rating.rating) as total_rating 
from shops 
LEFT JOIN rating on rating.shop_id = shops.id 
group by shops.id) q1 
LEFT JOIN services on services.shop_id = q1.id 
GROUP BY q1.id, q1.shopname, q1.rating_count, q1.total_rating 

http://sqlfiddle.com/#!9/ece82/20

Чтобы понять ваши проблемы запуска выберите без группы по и просто проверить строки, которые вы получите после того, как включается, но до их объединения. Вы отпустите, откуда поступает двойной счет.

+0

Без группы по возврату одной строки с total_rating 46 и всех трех сервисов – RaGu

+0

ваш запрос отлично работает, я думаю. Но для меня это было сложно. Мне нужно сделать этот запрос в codeigniter – RaGu

+0

Это то, что я имею в виду ни от одной группы: http://sqlfiddle.com/#!9/ece82/24 Я не понимаю, что вы подразумеваете под сложным запросом. Вы хотите, чтобы это было просто или вы хотите, чтобы он вычислил, что вам нужно? Вы можете разбить его на 2 простых запроса с одним левым внешним соединением в каждом из них. –

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