【问题标题】:SQL How to select original(distinct) values from table without using distinct, group by and over keywords?SQL如何在不使用distinct、group by和over关键字的情况下从表中选择原始(不同)值?
【发布时间】:2023-02-12 23:57:02
【问题描述】:

目前我正在学习,我收到了编写查询的任务(加入 4 个表:人员、货物、订单和订单详细信息)。所以主表 Order_details 有两列:Order_id 和 Good_id,以便可以在一个订单中包含许多商品(例如,id = 1 的订单在 Order_details 表中有 3 行,但每行具有不同的商品主键)。 所以问题是我不知道任何其他可能的方法(除了使用 group by、distinct 或 over() 之外)只接收 Order_details 表中每个订单的一行(就像我通过使用例如 Distinct 关键字得到的那样)。我收到每个订单的完全相同的行(具有相同的 Order_id 和 Good_id),但我不知道如何只获得每个订单的一行。 这是我的查询(所以基本上我需要按顺序选择所有商品的总和,但我认为这对我的问题并不重要)和方案(如果有帮助的话) 顺便说一句,我正在使用 MYSQL。

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 的方法,但它也不是关键)

【问题讨论】:

    标签: mysql sql database


    【解决方案1】:

    去掉FROM子句中的GoodsOrder_details表以及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;
    

    【讨论】:

      【解决方案2】:

      你可以对这种事情使用 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
      

      【讨论】:

      • Thx 这是一个很好的,但我不允许在我的查询中使用 over() ;((在我的问题正文中写了这个)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-23
      • 2023-04-09
      • 1970-01-01
      • 2019-02-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多