我有以下查询:
select group_concat(customer_name) customer_names,
count(customer_name) number_of_customers,
line_1,
line_2,
city,
state_name,
zip
from (select c.name customer_name,
ad.*,
s.name state_name
from address ad
join account_address aa on aa.address_id = ad.id
join account a on aa.account_id = a.id
join customer c on a.customer_id = c.id
join state s on ad.state_id = s.id
group by c.name) a
group by state_name, city, line_1, line_2
order by state_name, city, line_1, line_2
我是否必须按照我的方式进行嵌套才能获得两层分组?如果我不需要,我宁愿不要有任何子查询。
编辑:这是我最终使用的查询:
select group_concat(distinct c.name) customer_names,
count(distinct c.name) number_of_customers,
line_1,
line_2,
city,
s.name,
zip
from address ad
join account_address aa on aa.address_id = ad.id
join account a on aa.account_id = a.id
join customer c on a.customer_id = c.id
join state s on ad.state_id = s.id
group by s.name, city, zip, line_1, line_2
order by s.name, city, zip, line_1, line_2
答案 0 :(得分:1)
考虑到您的其他两列正在使用聚合函数,我认为您不需要嵌套查询。但是如果不对你的数据进行测试,就很难确定。
试试这个,看看:
select group_concat(customer_name) customer_names,
count(customer_name) number_of_customers,
line_1,
line_2,
city,
state_name,
zip
from address ad
join account_address aa on aa.address_id = ad.id
join account a on aa.account_id = a.id
join customer c on a.customer_id = c.id
join state s on ad.state_id = s.id
group by state_name, city, zip, line_1, line_2
order by state_name, city, zip, line_1, line_2
您应该在列中添加这些类型的查询中的表,即c.customer_name
答案 1 :(得分:1)
最里面的查询从为具有相同名称的客户定义的所有地址中选择一个(随机)地址。 (顺便说一下,state
甚至不必属于地址)
查询似乎是按州,城市和街道地址计算客户数。如果客户有多个地址怎么办?他们应该被计算一次或两次(如果一次,在哪个地址)?
换句话说,查询应该为这样的地址返回什么:
Customer1 NY NYC Broadway
Customer1 CA LA Sunset Boulevard
Customer2 CA LA Sunset Boulevard
您总共有三到两个客户吗?如果是两个,他们都住在LA
吗?
<强>更新强>
如果您想在每个地址上复制,那么您根本不需要最里面的GROUP BY
:
SELECT GROUP_CONCAT (DISTINCT customer_name) customer_names,
COUNT(DISTINCT customer_name) number_of_customers,
line_1,
line_2,
city,
state_name,
zip
FROM address ad
JOIN state s
ON s.id = ad.state_id
JOIN account_address aa
ON aa.address_id = ad.id
JOIN account a
ON a.id = aa.account_id
JOIN customer c
ON c.id = a.customer_id
GROUP BY
ad.state_id, ad.city, ad.line_1, ad.line_2
在address (state_id, city, line_1, line_2)
上创建一个索引,以便更快地运行。
请注意,如果可能为同一地址设置不同的邮政编码,则不会定义哪些邮政编码将被退回。