MySQL count生成具有union的子查询
我有一些使用UNION的查询,我想对它们进行计数,并在另一个查询中将其显示为一行 示例:我有一个名为“客户”的表,他们可以在store1、store2或Store3上购买,我需要显示他们的姓名以及他们在名为“销售”的行上购买的商品数量 如果john从2号店买了2件商品,从3号店买了1件商品,而mary什么也没买,那么预期结果如下: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
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,你是对的。