2016-06-17 2 views
1

Я знаю, что stackoverflow помнит ответ для этого вопроса, но у меня немного другая ситуация. У меня много ячеек во второй таблице, но SQL-запрос получается только первым. Ок, не весь запрос, только тег WHERE.Как заказать sql-запрос по другим значениям таблицы

Пример:
1 стол:

user_id = 1 
user_id = 2 

2 таблицы:

user_id = 1 | year = 2015 | rating = 55 
user_id = 1 | year = 2016 | rating = 10 
user_id = 2 | year = 2016 | rating = 50 
user_id = 2 | year = 2016 | rating = 5 

SQL-запрос:

$query = "SELECT c.*,v.upvotes 
     FROM ".PREFIX."_users c 
     LEFT JOIN (SELECT user_id,pol,vid_sporta,year_sport,category,SUM(rating) as upvotes 
     FROM ".PREFIX."_userrating 
     GROUP BY user_id 
     ) v 
     ON c.user_id = v.user_id 
     WHERE year_sport='2015' 
     ORDER BY upvotes DESC"; 

Этот запрос дает мне только одного пользователя, whitch имеет 2015 сначала.

Мне нужен то время как цикл в SQL запросе :) Помогите, пожалуйста :)

+0

В зависимости от того, где расположены поля 'pol, vid_sporta, year_sport, category', выбор их без группировки на них может быть рецептом для катастрофы. ... и он имеет только 1 запись, потому что только один удовлетворяет вашему условию WHERE ..... из-за группы:) – Uueerdo

+0

Каков ваш ожидаемый результат? –

+0

Спасибо :) Но мне нужен только один показ одного пользователя с оценкой этого пользователя. – Twelvee

ответ

1

Похоже, что там может быть несколько проблем происходит.

Во-первых,

SELECT user_id,pol,vid_sporta,year_sport,category,SUM(rating) as upvotes 

ДОЛЖНЫ БЫТЬ

SELECT user_id,SUM(rating) as upvotes 

Вы только хотите включить столбцы, которые возвращаются к остальной части вашего запроса и любой столбец, который не обособленно агрегатной функции должен также отображаться в вашем заявлении GROUP BY.

Во-вторых, и поэтому вы можете получать только 1 запись - это местоположение вашего WHERE year_sport = '2015'. Поскольку условие, в котором находится внешний запрос, обрабатывает ваш LEFT JOIN как INNER JOIN и ограничивает все результаты, которые имеют year_sport в userrating. Переместите оператор where в свой внутренний запрос, и вы должны получить всех своих пользователей, но только upvotes от year_sport =2015.

$query = "SELECT c.*,v.upvotes 
     FROM ".PREFIX."_users c 
     LEFT JOIN (SELECT user_id,SUM(rating) as upvotes 
     FROM ".PREFIX."_userrating 
     WHERE year_sport='2015' 
     GROUP BY user_id 
     ) v 
     ON c.user_id = v.user_id 
     ORDER BY upvotes DESC"; 
+0

Омг, ты так много! – Twelvee

+0

Просто обратите внимание, если вы знаете, что у вас есть только 1 рейтинг за год_sport = '2015' для пользователя, тогда вам не нужно и агрегировать функцию или группу. Это безопаснее, как сейчас, если вы включили несколько лет или есть дубликаты записей ... но вы можете изменить «SUM (рейтинг) AS, повышающий рейтинг« до »как« вверх ») и удалите предложение group by, как вы пробовали – Matt

+0

хорошо, спасибо еще раз :) – Twelvee

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