2014-01-08 5 views
-1

Пару дней назад кто-нибудь поможет мне подойти к этому запросу. Я пытаюсь получить первые 10 записей моей БД. Проблема заключается в точках. Когда я использую поле SUM on points, я получаю ровно двойное значение реального значения, если у вас более 1 записи того же пользователя ... Знаете ли вы, что я делаю неправильно? СпасибоSUM возвращает двойное значение

Это код, который возвращает только первую запись пользователя (не суммируется все точки одного и того же пользователя)

SELECT * 
FROM commerce 
LEFT JOIN points ON points.id_com = commerce.id 
LEFT JOIN comments ON comments.id_com = commerce.id AND (comments.validbycom = 1 AND comments.validbyus = 1) 
LEFT JOIN winners ON winners.id_com = commerce.id 
GROUP BY commerce.id 
ORDER BY SUM(points) DESC, COUNT(comments.id_com) DESC, commerce.date ASC, COUNT(winners.id_com) DESC LIMIT 10 

Это код, который возвращает точно двойник общая

SELECT SUM(points) 
    FROM commerce 
    LEFT JOIN points ON points.id_com = commerce.id 
    LEFT JOIN comments ON comments.id_com = commerce.id AND (comments.validbycom = 1 AND comments.validbyus = 1) 
    LEFT JOIN winners ON winners.id_com = commerce.id 
    GROUP BY commerce.id 
    ORDER BY SUM(points) DESC, COUNT(comments.id_com) DESC, commerce.date ASC, COUNT(winners.id_com) DESC LIMIT 10 
+1

Откуда вы знаете? – Strawberry

+3

Итак - один человек написал вам неправильный запрос. Теперь вы ищете другого человека, чтобы это исправить. Какова ваша роль в этой задаче? Управление? Если это так - это неправильное место, SO - сообщество разработчиков. – zerkms

+0

Я редактирую свой вопрос с двумя запросами, которые я использую, и проблемами, которые у меня есть – Gaby

ответ

0

Предположительно, points колонна прибывает из points таблицы. Дополнительные join s вводят дополнительные строки. Итак, попробуйте агрегирование перед выполнением объединения:

SELECT sumpoints, commerce.id 
FROM commerce LEFT JOIN 
    (select id_com, sum(points) as sumpoints 
     from points 
     group by id_com 
    ) points 
    ON points.id_com = commerce.id LEFT JOIN 
    comments 
    ON comments.id_com = commerce.id AND (comments.validbycom = 1 AND comments.validbyus = 1) LEFT JOIN 
    winners 
    ON winners.id_com = commerce.id 
GROUP BY commerce.id 
ORDER BY sumpoints DESC, COUNT(comments.id_com) DESC, commerce.date ASC, COUNT(winners.id_com) DESC 
LIMIT 10 
+0

что было ТОЧНО, что я хотел СПАСИБО ВАС УЛУЧИТЬ !!!!!!!!!!!! ... Я страдал, пытаясь изучить подзапросы, потому что я их никогда не использовал. Я был в правильном направлении, но вы помогаете быстрее добраться до конца! Еще раз спасибо;) – Gaby

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