联合二SQL查询

时间:2013-04-09 07:20:25

标签: mysql sql join union

我有这样的查询

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

有更好的解决方案吗?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用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

答案 1 :(得分:1)

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