Подсчитать количество предметов принадлежащих юзеру

Имею простую, но немного не до конца для меня понятную задачку по SQL.

Вкратце, у нас есть несколько таблиц, первая, accounts, где соответственно, хранится информация в виде "ключ-значение". Есть ячейки id, username, email.

Следующая таблица items, в которой хранится id предмета, его название и вес.

Третья таблица хранит информацию о связи между первыми двумя и содержит поля id предмета и id юзера.

Соответственно, конечная таблица должна содержать user_id, username, items, weight.

Выводить только если общая сумма веса больше 20.

Вопрос в том, как сделать подсчет предметов на основе их веса. То есть можно объявить переменную, которая будет равна:

SELECT COUNT(items.id) FROM items INNER JOIN accounts ON items.account_id 

Но как подсчитать суммарный вес предметов?

Например таблица выглядит так:

account_id item_id
1             1
1             3
1             2
1             1
item_id weight
1          5
2          15
3          25

Как запрограммировать подсчёт с помощью языка SQL? Спасибо!


Ответы (2 шт):

Автор решения: ValNik

Например, так

select a.id user_id,max(username) username, sum(wt) weight
  ,group_concat(ItemName) Items
from accounts a
left join 
(   -- сколько весит Item и как называется
  select user_id,item_id,item_qty*Itemweight wt,ItemName
  from( -- сколько у user'а каких item
    select user_id,item_id,count(*) item_qty
    from UserItem
    group by user_id,item_id
  )uig
  left join items i on i.id=uig.item_id
) uigw on uigw.user_id=a.id
group by a.id
having sum(wt)>20

или так:

select a.id user_id,username,weight,items
from accounts a
inner join 
  (
  select user_id,sum(wt) weight,group_concat(ItemName) Items
  from(
    select user_id,item_id,item_qty*Itemweight wt,ItemName
    from(
      select user_id,item_id,count(*) item_qty
      from UserItem
      group by user_id,item_id
      )uig
    left join items i on i.id=uig.item_id
   ) uigw 
   group by user_id
   having sum(wt)>20
)uigws on uigws.user_id=a.id
→ Ссылка
Автор решения: Дмитрий Бесшапошников

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

Не совсем понятно, как дальше использовать это поле, но если надо, значит надо. Посмотрите мое решение на sqlfiddle.com Код вот такой:

select 
  ui.user_id
  , u.username
  , group_concat(i.id) as items
  , sum(i.weight) as weight
from accounts u
left join user_item ui
  on ui.user_id = u.id
left join items i
  on i.id = ui.item_id
group by ui.user_id, u.username
having sum(i.weight) > 20

p.s. перечитал вопрос и понял, что не до конца понятно, что должно лежать в поле items. В моем решении там лежит список предметов пользователя. Вам это и нужно? или нужно количество предметов?

Если нужно количество предметов, то просто замените group_concat на count

→ Ссылка