【问题标题】:Union Two SQL Queries联合两个 SQL 查询
【发布时间】:2026-02-02 21:20:04
【问题描述】:

我有这样的查询

SELECT o.product_id,
       p.name,
       count(o.product_id) AS total_products_sold,
       (SELECT count(o.id)
        FROM ebay.`order` o) AS total_orders
FROM ebay.`order` o
INNER JOIN product p ON o.product_id = p.id
GROUP BY o.product_id

total_orders 在为每个我不想要的东西执行时重新运行。我

问题:

我希望 total_orders 与外部查询的每个结果集相结合。

我试过了,但它只返回 1 行

SELECT tps.product_id,
       tps.name,
       tps.total_products_sold,
       count(oo.id) AS total_orders
FROM ebay.`order` oo
INNER JOIN
  ( SELECT o.id,
           o.product_id,
           p.name,
           count(o.product_id) AS total_products_sold
   FROM ebay.`order` o
   INNER JOIN product p ON o.product_id = p.id
   GROUP BY o.product_id ) AS tps ON oo.product_id = tps.product_id

有更好的解决方案吗?

谢谢。

【问题讨论】:

  • 你能给出你想要的结果的样本记录吗?

标签: mysql sql join union


【解决方案1】:

您可以使用with rollup,它会在不更改实际查询的情况下为您提供总数 它不会在每一行的列中为您提供结果,但您将在最后一行中获得总订单的结果。

SELECT 
  o.product_id,
  p.name,
  count(distinct o.id) AS totalorder
FROM 
  ebay.`order` o
INNER JOIN 
  product p 
ON 
  o.product_id = p.id
GROUP BY 
  o.product_id
WITH ROLLUP

例如

+-----------+------+------------+
| product_id| name | totalorder |
+-----------+------+------------+
|      2000 |   A  |     10     |
|      2001 |   B  |     20     |
|      NULL | NULL |     30     |   <--- Last row is having the Total order 
+-----------+------+------------+

WITH ROLLUP

【讨论】:

    【解决方案2】:
    SELECT  tps.product_id,
            tps.name,
            tps.total_products_sold,
            s.total_orders
    FROM    ebay.`order` oo
            INNER JOIN
            ( 
                SELECT  o.id,
                        o.product_id,
                        p.name,
                        count(o.product_id) AS total_products_sold
                FROM    ebay.`order` o
                        INNER JOIN product p 
                            ON o.product_id = p.id
                GROUP   BY o.product_id 
            ) AS tps ON oo.product_id = tps.product_id
            CROSS JOIN
            (
                SELECT  count(id) total_orders
                FROM    ebay.`order`
            ) s
    

    【讨论】:

    • 什么是交叉连接?我们什么时候使用cross join的情况?