mysql:每个子查询结果返回列

标签 mysql

我有 3 个表:customersordersorder-items。该问题要求编写一个 SELECT 语句,该语句将返回一个带有

的表
  • 客户的电子邮件地址
  • 该客户的订单数量
  • 以及每个订单的总费用


前两点相当简单:

SELECT email_address,
       (SELECT SUM(order_id) 
        FROM orders 
        WHERE orders.customer_id = cust.customer_id) as "order_count"
FROM customers as cust


我知道我可以获取每个订单的 order_total,如下所示:

SELECT order_id, 
    (SELECT SUM((item_price - discount_amount) * quantity)
     FROM order_items 
     WHERE order_items.order_id = ord.order_id) as "order_total"
FROM orders AS ord


但是,如果我尝试将它们结合起来并执行以下操作:

SELECT email_address,
       (SELECT SUM(order_id)
        FROM orders AS ord
        WHERE ord.customer_id = cust.customer_id) as "order_count",
       (SELECT(SELECT SUM((item_price - discount_amount) * quantity)
         FROM order_items 
         WHERE order_items.order_id = ord.order_id)
         FROM orders AS ord
         WHERE ord.customer_id = cust.customer_id) as "order_total"
FROM customers as cust;

我得到:

Subquery returns more than 1 row

我明白为什么会出现这个错误。因为是的,子查询确实返回多行。我想要的是将每一行的值放置在另一列中(至少这是我解释的问题)。例如:

email_address    |  order_count  |  order1_total  |  order2_total  |  etc...
============================================================================
john_doe@foo.com |      2        |     $100       |       $200     |   NULL


数据库的表如下所示:

客户(customer_id、email_address)
订单(order_id,customer_id)
order_items(item_id、order_id、item_price、discount_amount、数量)


作业中提出的问题:
(我认为措辞确实很糟糕,但我知道什么?):)

编写一条 SELECT 语句,为每个具有以下列的订单的客户返回一行:

  • 客户表中的 email_address
  • 订单数量统计
  • 每个订单的总金额(提示:首先从价格中减去折扣金额,然后乘以数量。)

仅返回客户拥有超过 1 个订单的行。 按行项目金额的总和降序对结果集进行排序。

最佳答案

您可以通过使用 GROUP BY 聚合来避免此类关联子查询:

SELECT
    c.email_address,
    COUNT(DISTINCT o.order_id) AS num_orders,
    COALESCE(SUM(oi.quantity * (oi.item_price - oi.discount_amount)), 0) AS total_amount
FROM customers c
LEFT JOIN orders o
    ON c.customer_id = o.customer_id
INNER JOIN order_items oi
    ON o.order_id = oi.order_id
GROUP BY
    c.customer_id,
    c.email_address;

关于mysql:每个子查询结果返回列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52529108/

相关文章:

mysql - 数据库和表

mysql - Liquibase 无法传递 changeLogParameters

javascript - 单击按钮时如何添加新文本字段

mysql - 如何从 sip_regisration 表中删除条目?

php - 如何在查询中使用数组中的数据

php - laravel递归显示按级别/深度推荐的用户

MySQL排序不排序?

php - 序列化还是保留一个单独的表?

MySQL 如果 A 行存在则选择 A 行和 B 行

mysql - PERL - DBD::mysql::st 执行失败:MySQL 客户端内存不足