我在表格中有以下数据:
id person_id item_id price
1 1 1 10
2 1 1 20
3 1 3 50
现在我要做的是按项目ID分组,选择具有最高价值的ID并获取价格。
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 :(得分:2)
以下是您要实现的目标。首先,您需要在子查询中进行分组,而不是在外部查询中进行分组。在外部查询中,您只需要求和:
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
答案 1 :(得分:1)
http://sqlfiddle.com/#!9/40803/5
SELECT SUM(t1.price)
FROM tbl t1
LEFT JOIN tbl t2
ON t1.person_id= t2.person_id
AND t1.item_id = t2.item_id
AND t1.id<t2.id
WHERE t1.person_id = 1
AND t2.id IS NULL;
答案 2 :(得分:0)
我不确定这是否是你唯一的要求。如果是这样,试试这个。
SELECT SUM(price)
FROM
(SELECT MAX(price)
FROM table
WHERE person_id = 1
GROUP BY item_id)
答案 3 :(得分:0)
首先 - 您不需要 person 表,因为另一个表已包含 person_id 。所以我从示例中删除了它。
您的查询会返回每个项目的价格总和。
如果您将SELECT SUM(price)
替换为SELECT item_id, SUM(price)
,您将获得
item_id SUM(`price`)
1 30
3 50
但那不是你想要的。也不是你在问题中所写的内容&#34; (10 + 20 + 50)&#34;。
现在用SELECT id, item_id, SUM(price)
替换第一行,您将为每个项目获得一行 id 。
id item_id price
2 1 20
3 3 50
这是因为&#34; 未记录的功能&#34; MySQL,它允许您选择未在GROUP BY
子句中列出的列,并从每个组的子选择中获取第一行(在这种情况下为每个项目)。
现在,您只需要在其他外部选择
中将 price 列相加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
但是我不建议使用&#34;功能&#34;。虽然它仍适用于MySQL 5.6,但您永远不知道它是否适用于较新版本。它已经无法在MariaDB上运行。
相反,您可以为子选择中的每个项目确定MAX(id)
,只选择具有确定的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
)
另一种解决方案(内部做同样的事)是
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
如果组(每人和每个项目的行数)相当小,那么Alex的解决方案也可以正常工作。
答案 4 :(得分:0)
您在主查询中使用了group by,但它位于子查询中,如
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