目前我正在學習,我收到了撰寫查詢的任務(加入 4 個表:人員、商品、訂單和訂單詳細資訊)。所以主表Order_details 有兩列:Order_id 和Good_id,以便在一個訂單中有很多商品(例如,id = 1 的訂單在Order_details 表中有3 行但每行有不同的商品主鍵)。所以問題是我不知道任何其他可能的方法(除了使用 group by、distinct 或 over())來僅接收 Order_details 表中每個訂單的一行(就像我通過使用例如 Distinct 關鍵字得到的那樣)。我收到的每個訂單的行完全相同(具有相同的 Order_id 和 Good_id),但我不知道如何只獲取每個訂單的一行。這是我的查詢(所以基本上我需要按順序選擇所有商品的總和,但我沒有
SELECT
Order_details.Order_id,
Orders.Date, People.First_name,
People.Surname,
(
SELECT SUM(Goods.Price * Order_details.Quantity)
FROM Order_details, Goods
WHERE Order_details.Good_id = Goods.Good_id
AND Order_details.Order_id = Orders.Order_id
) AS Total_price
FROM Order_details, Goods, Orders, People
WHERE Order_details.Order_id = Orders.Order_id
AND Order_details.Good_id = Goods.Good_id
AND Order_details.Order_id = Orders.Order_id
AND Orders.Person_id = People.Person_id
ORDER BY Order_id ASC;

我嘗試了幾種方法,但仍然無法弄清楚。也許以某種方式可以使用子查詢?但我不確定......(我嘗試過使用 UNION 的方法,但這也不是關鍵)
uj5u.com熱心網友回復:
從子句中洗掉Goods和Order_details表以及FROM子句中的相應條件WHERE。無論如何,您都沒有從中選擇任何東西,除了子選擇中的 SUM。Order_id可以從Orders表中選擇。連接只會導致每個訂單出現多行。
也請不要用逗號加入。使用JOIN .. ON語法。這樣可以更容易地查看連接條件是否合理。
SELECT
Orders.Order_id
Orders.Date,
People.First_name,
People.Surname,
(
SELECT SUM(Goods.Price * Order_details.Quantity)
FROM Order_details
JOIN Goods ON Order_details.Good_id = Goods.Good_id
WHERE Order_details.Order_id = Orders.Order_id
) AS Total_price
FROM Orders
JOIN People ON Orders.Person_id = People.Person_id
ORDER BY Orders.Order_id ASC;
uj5u.com熱心網友回復:
您可以將 row_number() 用于這種事情,它將根據您的條件分配一個行號,然后您可以選擇值為 1 的行。
with t as (SELECT
Order_details.Order_id,
Orders.Date, People.First_name,
People.Surname,
row_number() over (
partition by order_id, good_id
order by order_id, good_id) rn,
(
SELECT SUM(Goods.Price * Order_details.Quantity)
FROM Order_details, Goods
WHERE Order_details.Good_id = Goods.Good_id
AND Order_details.Order_id = Orders.Order_id
) AS Total_price
FROM Order_details, Goods, Orders, People
WHERE Order_details.Order_id = Orders.Order_id
AND Order_details.Good_id = Goods.Good_id
AND Order_details.Order_id = Orders.Order_id
AND Orders.Person_id = People.Person_id
ORDER BY Order_id ASC)
select * from t where rn = 1
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/523328.html
標籤:mysqlsql数据库
