2015-12-22 4 views
0

У меня есть следующие данные внутри таблицы:MYSQL - группы/Заказывайте не работает

id person_id item_id price 
1 1   1  10 
2 1   1  20 
3 1   3  50 

Теперь то, что я хочу сделать, это группа по идентификатору, выберите идентификатор, который имеет наибольшее значение и возьмите цену.

E.g. сумма будет: (20 + 50) и игнорировать 10.

Я использую следующее:

SELECT SUM(`price`) 
FROM 
    (SELECT id, person_id, item_id, price 
    FROM `table` tbl 
    INNER JOIN person p USING (person_id) 
    WHERE p.person_id = 1 
    ORDER BY id DESC) x 
GROUP BY item_id 

Однако этот запрос по-прежнему добавляя (10 + 20 + 50), что, очевидно, не то, что мне нужно.

Любые идеи, в которых я ошибаюсь?

+0

@lvar - Нет, так как я хочу, чтобы все элементы, которые имеют отношение к этому человеку – Phorce

+0

@RyanVincent Если я вывожу '(SELECT id..')' он показывает все 3 значения – Phorce

ответ

1

Вот что вы пытаетесь достичь. Сначала вам нужна группировка в подзапросе, а не во внешнем запросе. Во внешнем запросе вам нужна только сумма:

SELECT SUM(`price`) 
FROM 
    (SELECT MAX(price) as price 
    FROM `table` tbl 
    INNER JOIN person p USING (person_id) 
    WHERE p.person_id = 1 
    GROUP BY item_id) x 
+0

, что означает 'INNER JOIN person p'? – Alex

+0

@Alex, я просто скопировал запрос из вопроса. Может быть, столбцы 'price' или' itemid' из таблицы 'person' я не знаю. –

+0

@Giorgi Nakeuri Он не должен возвращать максимальную цену, он должен работать с MAX (id), поскольку это самое текущее значение. MAX (цена) не всегда прав. Моя проблема в том, что цена может быть 1000 ТО, что на следующий день может быть 900 .. Я просто хочу взять 900, поскольку это самый современный – Phorce

0

Я не уверен, что это единственное требование, которое у вас есть. Если да, попробуйте это.

SELECT SUM(price) FROM (SELECT MAX(price) FROM table WHERE person_id = 1 GROUP BY item_id)

0

Прежде всего - вам не нужен человек стол, потому что другая таблица уже содержит 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 

решение Алекс также отлично работает, если группы (количество строк на человека и пункта) достаточно малы.

0

Вы использовали группу, в основном запросе, но на подзапрос как

SELECT id, person_id, item_id, SUM(`price`) FROM ( SELECT MAX(price) FROM `table` tbl WHERE p.person_id = 1 GROUP BY item_id ) AS x