【问题标题】:mysql: get two values from subquerymysql:从子查询中获取两个值
【发布时间】:2018-10-06 00:30:26
【问题描述】:

我正在尝试使用子查询来检索每个客户的最早订单。我要选择email_addressorder_idorder_date


表格:

客户(customer_id、email_address)

订单(order_id、order_date、customer_id)


我尝试过的:

我可以通过这样做获得order_idorder_date

SELECT email_address, 
       (SELECT order_date /* or order_id */
        FROM orders o
        WHERE o.customer_id = c.customer_id
        ORDER BY order_date LIMIT 1)
FROM customers c
GROUP BY email_address;

但如果我尝试在子查询中执行 SELECT order_id, order_date,则会收到错误消息:

操作数应包含 1 列

【问题讨论】:

  • 在您的示例中执行子查询时,它必须返回一列,因为它成为结果中的一列。简单地将查询复制为另一列,然后更改它返回的列。
  • @SloanThrasher 那是我最初的爱好,但我内心的 DRY 程序员并不满足!

标签: mysql


【解决方案1】:

您可以使用 JOIN 解决此问题,但您需要注意仅将 JOIN 设置为给定客户的最旧值:

SELECT c.email_address, o.order_id, o.order_date
FROM customers c
JOIN orders o ON o.customer_id = c.customer_id AND
    o.order_date = (SELECT MIN(order_date) FROM orders o2 WHERE o2.customer_id = c.customer_id)

【讨论】:

    【解决方案2】:

    您可以使用 JOIN 来获得您想要的结果,或者修改您的查询如下:

    SELECT email_address, 
        (SELECT order_date
        FROM orders o1
        WHERE o1.customer_id = c.customer_id
        ORDER BY order_date LIMIT 1) as `order_date`,
        (SELECT order_id
        FROM orders o2
        WHERE o2.customer_id = c.customer_id
        ORDER BY order_date LIMIT 1) as `order_id`
    FROM customers c
    GROUP BY email_address;
    

    【讨论】:

      【解决方案3】:

      JOIN 由您选择。 How can I select multiple columns from a subquery (in SQL Server) that should have one record (select top 1) for each record in the main query?

      SELECT o.order_id, c.email_address, o.order_date
      FROM customers c
      INNER JOIN (
          SELECT order_date, order_id, customer_id
          FROM orders o
          ORDER BY order_date
      ) as o on o.customer_id = c.customer_id
      GROUP BY email_address;
      

      【讨论】:

      • 您需要在 JOIN 中设置某种限制才能仅检索最旧的订单。
      猜你喜欢
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多