MYSQL - Group By / Order By not working

时间:2015-12-22 14:43:14

标签: mysql

我在表格中有以下数据:

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),这显然不是我需要的。

我出错的任何想法?

5 个答案:

答案 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  
相关问题