2015-09-22 3 views
1

У меня есть таблица под названием «Покупки», принадлежащая Пользователям (то есть покупка имеет внешний ключ для пользователя).Левое внешнее соединение + SUM с группой по

В таблице «Покупки» есть столбец с именем «количество» и столбец «state_id», оба являются целыми числами.

Я хочу, чтобы иметь возможность порядка пользователей, их законченной покупка (state_id = 10), где сумма их величин больше, чем> 100. То есть, все пользователи, имеющие в общей сложности завершенных закупок> 100, должен появиться первым, а остальное сразу после.

Это то, что я пробовал:

SELECT users.id as user_id, 
     SUM(CASE WHEN purchases.state_id = 5 
       THEN purchases.quantity 
       ELSE 0 
      END) as quantity 
FROM users 
LEFT OUTER JOIN purchases ON purchases.user_id = users.id 
GROUP BY purchases.user_id 

Но это только возвращение мне один пользователь, не все из них. Что мне не хватает?

+0

следующий раз попытаться обеспечить [** SqlFiddle **] (http://sqlfiddle.com/#! 15/5368b/6), чтобы мы могли лучше понять проблему и дать вам ответ намного быстрее. Или, по крайней мере, некоторые образцы данных –

+0

О, хороший звонок. Я сделаю это! –

+1

Я бы группировал 'users.id', а не' purchase.user_id', поскольку внешнее объединение приведет к тому, что последнее будет 'NULL', если в таблице' purchase' нет соответствующих записей. – eggyal

ответ

0

Вы можете ОБЪЕДИНЯТЬ только завершенные покупки, используя условие JOIN. И вы должны группировать по users.id не purchases.user_id, как только вы можете иметь пользователей в таблицу без покупок на всех:

SELECT users.id as user_id, 
     SUM(purchases.quantity) as quantity 
FROM users 
LEFT JOIN purchases ON (users.id=purchases.user_id) 
         AND (purchases.state_id = 10) 
GROUP BY users.id 
ORDER BY quantity DESC 
Смежные вопросы