Прежде всего - вам не нужен человек стол, потому что другая таблица уже содержит person_id. Поэтому я удалил его из примеров.
Ваш запрос возвращает сумму цен для каждого товара. Если заменить SELECT SUM(price)
с SELECT item_id, SUM(price)
вы Виль получить
item_id SUM(`price`)
1 30
3 50
Но это не то, что вы хотите. И это не то, что вы написали в вопросе «(10 + 20 + 50)».
Теперь, заменив первую строку SELECT id, item_id, SUM(price)
, вы получите по одной строке для каждого элемента с наивысшим id.
id item_id price
2 1 20
3 3 50
Это работает из-за «документировано» из MySQL, которым позволяет выбрать столбцы, которые не перечислены в пункте GROUP BY
и получить первую строку из подвыборки каждой группы (каждый пункт в этом дело).
Теперь вам нужно только просуммировать цены столбец в качестве дополнительного внешнего выбора
SELECT SUM(price)
FROM (
SELECT id, item_id ,price
FROM (
SELECT id, person_id, item_id, price
FROM `table` tbl
WHERE tbl.person_id = 1
ORDER BY id DESC) x
GROUP BY item_id
) y
Однако я не рекомендуем использовать, что «особенность». Хотя он по-прежнему работает на MySQL 5.6, вы никогда не знаете, будет ли это работать с более новыми версиями. Он уже не работает на MariaDB.
Вместо этого вы можете определить MAX(id)
для каждого элемента в подзапросе, выбрать только строки с определенными идентификаторами и получить их суммарную цену.
SELECT SUM(`price`)
FROM `table` tbl
WHERE tbl.id IN (
SELECT MAX(tbl2.id)
FROM `table` tbl2
WHERE tbl2.person_id = 1
GROUP BY tbl2.item_id
)
Другим решением (которым internaly делает то же самое) является
SELECT SUM(`price`)
FROM `table` tbl
JOIN (
SELECT MAX(tbl2.id) as id
FROM `table` tbl2
WHERE tbl2.person_id = 1
GROUP BY tbl2.item_id
) x ON x.id = tbl.id
решение Алекс также отлично работает, если группы (количество строк на человека и пункта) достаточно малы.
@lvar - Нет, так как я хочу, чтобы все элементы, которые имеют отношение к этому человеку – Phorce
@RyanVincent Если я вывожу '(SELECT id..')' он показывает все 3 значения – Phorce