Этот запрос должен быть вложенным? - PullRequest
2 голосов
/ 03 ноября 2010

У меня следующий запрос:

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 ]

1 голос
/ 03 ноября 2010

Самый внутренний запрос выбирает один (случайный) адрес из всех, определенных для клиентов с одинаковыми именами.(Между прочим, state, кстати, даже не должен принадлежать адресу)

Похоже, что запрос подсчитывает клиентов по штатам, городам и улицам.Что делать, если у клиента более одного адреса?Должны ли они учитываться один или два раза (и если один раз, по какому адресу)?

Другими словами, что должен возвращать запрос для таких адресов:

Customer1  NY  NYC   Broadway
Customer1  CA  LA    Sunset Boulevard
Customer2  CA  LA    Sunset Boulevard

У вас есть триили два клиента в общей сложности?Если два, они оба живут в LA?

Обновление:

Если вы хотите дубликаты на каждом адресе, то вам не нужен самый внутренний GROUP BY at all:

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), чтобы это работало быстрее.

Обратите внимание, что если возможно иметь разные почтовые индексы для одинаковых адресов, не определено, какиеиз них будут возвращены.

1 голос
/ 03 ноября 2010

Учитывая, что ваши два других столбца используют агрегатные функции, я не думаю, что вам нужен вложенный запрос. Но, не проверяя это на ваших данных, трудно быть уверенным.

Попробуйте и посмотрите:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...