此查询是否必须嵌套?

时间:2010-11-03 16:03:49

标签: mysql database sql

我有以下查询:

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

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)上创建一个索引,以便更快地运行。

请注意,如果可能为同一地址设置不同的邮政编码,则不会定义哪些邮政编码将被退回。

相关问题