考虑以下情况:
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和最大价格总和?
答案 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
祝你好运:)