MySQL count生成具有union的子查询

MySQL count生成具有union的子查询,mysql,union,Mysql,Union,我有一些使用UNION的查询,我想对它们进行计数,并在另一个查询中将其显示为一行 示例:我有一个名为“客户”的表,他们可以在store1、store2或Store3上购买,我需要显示他们的姓名以及他们在名为“销售”的行上购买的商品数量 如果john从2号店买了2件商品,从3号店买了1件商品,而mary什么也没买,那么预期结果如下: name | sales ------------ john | 3 mary | 0 SELECT c.name, sum(s.qt) as qt from cl

我有一些使用UNION的查询,我想对它们进行计数,并在另一个查询中将其显示为一行

示例:我有一个名为“客户”的表,他们可以在store1、store2或Store3上购买,我需要显示他们的姓名以及他们在名为“销售”的行上购买的商品数量

如果john从2号店买了2件商品,从3号店买了1件商品,而mary什么也没买,那么预期结果如下:

name | sales
------------
john | 3
mary | 0
SELECT c.name, sum(s.qt) as qt
from clients c
join (
    SELECT client.id, COUNT(*) FROM(
        SELECT client, sum(1) as qt FROM store1 group by client
        UNION
        SELECT client, sum(1) as qt FROM store2 group by client
        UNION
        SELECT client, sum(1) as qt FROM store3 group by client
    ) as sales s on (s.client = c.id)
group by c.name
但我有一个错误:

您的SQL语法有错误;查看与您的MySQL服务器版本对应的手册,以了解可在“来自客户端”附近使用的正确语法

这是使用另一个选择子查询的另一次尝试:

SELECT name,(
    SELECT COUNT(*) FROM(
        SELECT 1 FROM store1 WHERE store1.client=clients.id
        UNION
        SELECT 1 FROM store2 WHERE store2.client=clients.id
        UNION
        SELECT 1 FROM store3 WHERE store3.client=clients.id
    ) xxxx -- (mandatory table name)
) sales
FROM clients
这给了我这个错误:

“where子句”中的未知列“clients.id”


我希望你能帮助我,提前谢谢你

首先合并表格,然后过滤结果和计数

 SELECT name,COUNT(*)  
 FROM clients  INNER JOIN
     (
     SELECT client as id, 1 FROM store1 
         UNION
     SELECT client as id, 1 FROM store2 
         UNION
     SELECT client as id, 1 FROM store3
     )

     as Stores on clients.id = Stores.id
     GROUP by name
不能引用间隔超过1级的字段。由于store1.client的深度为2级,而客户端的深度为0级,因此您的分离级别超过了1级,这是不允许的

   SELECT C.name, count(1)
   FROM (
        SELECT 'Store1' as StoreTable, a.* FROM store1 a UNION
        SELECT 'Store2', b.* FROM store2 b UNION
        SELECT 'Store3', c.* FROM store3 c
    ) S
    RIGHT JOIN clients C
     on C.ID = S.Client       
    GROUP BY Name
这有几个假设

  • 每个存储表之间的数据结构相同
  • 您可能需要存储表中的其他数据,该表现在可以访问

  • 我可以更进一步,创建一个名为“Stores”的视图,将联合中的所有“Stores”连接起来,以简化跨存储的其他查询。通过在视图中硬编码“StoreTable”名称,如果需要,您可以始终识别源表。

    首先合并表,然后过滤结果和计数

    您不能引用超过1级分隔的字段。由于store1.client有2级深,而客户端位于0级,因此您的分隔级别超过1级,这是不允许的

       SELECT C.name, count(1)
       FROM (
            SELECT 'Store1' as StoreTable, a.* FROM store1 a UNION
            SELECT 'Store2', b.* FROM store2 b UNION
            SELECT 'Store3', c.* FROM store3 c
        ) S
        RIGHT JOIN clients C
         on C.ID = S.Client       
        GROUP BY Name
    
    这有几个假设

  • 每个存储表之间的数据结构相同
  • 您可能需要存储表中的其他数据,该表现在可以访问

  • 我可以更进一步,创建一个名为“Stores”的视图,将联合中的所有“Stores”连接起来,以简化跨存储的其他查询。通过在视图中硬编码一个“StoreTable”名称,如果需要,您可以随时识别源表。

    差不多了。尝试以下方法:

    name | sales
    ------------
    john | 3
    mary | 0
    
    SELECT c.name, sum(s.qt) as qt
    from clients c
    join (
        SELECT client.id, COUNT(*) FROM(
            SELECT client, sum(1) as qt FROM store1 group by client
            UNION
            SELECT client, sum(1) as qt FROM store2 group by client
            UNION
            SELECT client, sum(1) as qt FROM store3 group by client
        ) as sales s on (s.client = c.id)
    group by c.name
    
    我可能会混淆MySQL和SQLServer,我会测试并让您知道是否有不同之处


    更新:更正了子查询,添加了sum和group_by,并删除了where子句。如果您不想从所有商店获得所有客户,它可能会对性能产生影响。

    差不多了。尝试以下方法:

    name | sales
    ------------
    john | 3
    mary | 0
    
    SELECT c.name, sum(s.qt) as qt
    from clients c
    join (
        SELECT client.id, COUNT(*) FROM(
            SELECT client, sum(1) as qt FROM store1 group by client
            UNION
            SELECT client, sum(1) as qt FROM store2 group by client
            UNION
            SELECT client, sum(1) as qt FROM store3 group by client
        ) as sales s on (s.client = c.id)
    group by c.name
    
    我可能会混淆MySQL和SQLServer,我会测试并让您知道是否有不同之处


    更新:更正了子查询,添加了sum和group_by,并删除了where子句。如果您不想从所有商店获得所有客户,它可能会影响性能。

    如果您想要计数为0的客户,则需要在我的示例中使内部联接正确。您是对的,您是否可以编辑右联接的查询以将其标记为解决方案?如果您希望客户端计数为0,则需要在我的示例中使内部联接成为右联接。您是对的,您是否可以编辑右联接的查询以将其标记为解决方案?您不需要在子查询中使用
    GROUP BY
    ?而且
    s.client\u id
    应该是
    s.id
    。可能是的。我使用了发布的原始结构。可能是sum(qt)和group by client_id。关于id,您是对的。子查询中不需要
    group by
    ?而且
    s.client\u id
    应该是
    s.id
    。可能是的。我使用了发布的原始结构。可能是sum(qt)和group by client_id。关于id,你是对的。