如何找到MAX over SUMs MySQL

时间:2016-04-21 13:27:01

标签: mysql sql rdbms

考虑以下情况:

an Item has a Price

a Order contains Items

a Delivery contains Orders

我想查询每笔交货,即具有最高价格的订单,其中订单的价格是所包含商品的价格总和。

一个简单的足够模式如下所示:

投放

D_ID

顺序

o_id

项目

i_id ,价格

ItemsInOrder

o_id i_id

OrdersInDelivery

D_ID o_id

我遇到了总和结果,需要获得每次交货的最大订单:

SELECT d_id,o_id,SUM(price)
from ItemsInOrder
natural join OrdersInDelivery
natural join Item
group by d_id,o_id

我应该如何从这里得到每个d_id,一次出现o_id和最大价格总和?

4 个答案:

答案 0 :(得分:1)

您可以使用Left Joining with self,调整连接条件和过滤器。 在这种方法中,你自己加入了表。当然,平等在组标识符中。

SELECT a.*
FROM (
        SELECT oid.d_id AS d_id, o_id, SUM(price) AS sum_price
        FROM `OrdersInDelivery` oid
        INNER JOIN `ItemsInOrder` iio USING (o_id) 
        INNER JOIN `Item` i USING (i_id)
        GROUP BY d_id, o_id
      ) a
LEFT OUTER JOIN (
                  SELECT oid.d_id AS d_id, o_id, SUM(price) AS sum_price
                  FROM `OrdersInDelivery` oid
                  INNER JOIN `ItemsInOrder` iio USING (o_id) 
                  INNER JOIN `Item` i USING (i_id)
                  GROUP BY d_id, o_id
                )b
    ON a.d_id = b.d_id  AND a.sum_price < b.sum_price
WHERE b.d_id IS NULL  AND b.o_id IS NULL;

在SQL小提琴中查看此查询:http://sqlfiddle.com/#!9/d5c04d/1

在这种情况下,建议使用TEMPORARY TABLE

    CREATE TEMPORARY TABLE OrderSummary(
     SELECT oid.d_id AS d_id, o_id, SUM(price) AS sum_price
            FROM `OrdersInDelivery` oid
            INNER JOIN `ItemsInOrder` iio USING (o_id) 
            INNER JOIN `Item` i USING (i_id)
            GROUP BY d_id, o_id
    );
CREATE TEMPORARY TABLE OrderSummary2(
     SELECT * FROM OrderSummary
    );

    SELECT a.*
    FROM OrderSummary a
    LEFT OUTER JOIN OrderSummary2 b
        ON a.d_id = b.d_id  AND a.sum_price < b.sum_price
    WHERE b.d_id IS NULL  AND b.o_id IS NULL;

答案 1 :(得分:1)

感谢您的所有答案,但这些都不是我想要的。我终于找到了我想要的东西,我选择的方法如下:

SELECT d_id,o_id,sum_price
FROM (
    SELECT d_id,o_id,SUM(price) as sum_price
    from ItemsInOrder
    natural join OrdersInDelivery
    natural join Item
    group by d_id,o_id
    order by d_id,sum_price desc
) as sums
GROUP BY d_id

答案 2 :(得分:0)

请勿使用!IsPostBack。它们是一个等待发生的错误,因为它们依赖于表中列的名称 - 甚至不使用正确和明确定义的外键关系。请改用protected void Page_Load(object sender, EventArgs e) { if(!IsPostBack) { string ID = Request.QueryString["Id"].ToString(); SqlConnection baglan = new SqlConnection(ConnectionString3); baglan.Open(); SqlCommand com = new SqlCommand("Select * from pkategori where Id='" + ID + "'", baglan); SqlDataReader oku = com.ExecuteReader(); if (oku.Read()) { baslik.Text = oku["Tanim"].ToString(); detaylar.Text = oku["Detaylar"].ToString(); } else { baslik.Text = "Bulunmadı"; } } } natural join

这种类型的查询在MySQL中很痛苦,因为MySQL不支持CTE(公用表表达式),也不支持窗口函数。因此,查询比其他数据库更复杂:

on

答案 3 :(得分:0)

我分享了我迄今为止所得到的结果,所以任何人都可以继续帮助你,因为我现在需要离开机场:)如果没有,我明天会再试一次一个想出来的。

这是一个具有挑战性的问题。

我已在这里准备了一些样品: http://sqlfiddle.com/#!9/d4fed2

我做的最新查询是:

SELECT d_id,OID.o_id,sumPrice
from OrdersInDelivery OID
join (SELECT IIO.o_id,SUM(I.price) as sumPrice
from ItemsInOrder IIO 
join item I on I.i_id = IIO.i_id
group by IIO.o_id) IIO1 on OID.o_id = IIO1.o_id
祝你好运:)