Выберите и посчитайте, где результат находится в другом месте

#mysql #select

#mysql #выберите

Вопрос:

У меня есть таблица, подобная следующей:

 ID | Name              | Type        | State            | County
-------------------------------------------------------------------
1  | Rheinland-Pfalz   | State       | Rheinland-Pfalz  | NULL
2  | Trier             | City        | Rheinland-Pfalz  | NULL
3  | Alzey-Worms       | County      | Rheinland-Pfalz  | Alzey-Worms
4  | Alzey             | City        | Rheinland-Pfalz  | Alzey-Worms
5  | Worms             | City        | Rheinland-Pfalz  | Alzey-Worms
6  | Lorem             | County      | Rheinland-Pfalz  | Lorem
7  | Ipsum             | City        | Rheinland-Pfalz  | Lorem
  

Теперь я хочу получить все округа в штате «Рейнланд-Пфальц» и включенные в них города и все свободные города округа.

Желаемый результат:

 ID | Name          | Type        | Included         
-------------------------------------------------------------------
2  | Trier         | City        | NULL  
3  | Alzey-Worms   | County      | 2  
6  | Lorem         | County      | 1
  

Мой запрос:

 select a.id, a.name, a.type,
                (select count(*) from data where a.type="city" AND b.county=a.county) as included
                from data as a, data as b
                WHERE a.location_type='county' AND a.state = 'Rheinland-Pfalz' OR a.type='city' AND a.gmap_area1 = 'Rheinland-Pfalz' AND a.county IS NULL
                order by a.name asc
  

Мой результат:

 ID | Name          | Type        | Included         
-------------------------------------------------------------------
3  | Alzey-Worms   | County      | 0  
3  | Alzey-Worms   | County      | 0  
3  | Alzey-Worms   | County      | 0  
3  | Alzey-Worms   | County      | 0  
3  | Alzey-Worms   | County      | 0
  

…. И ТАК ДАЛЕЕ

Комментарии:

1. Работает ли приведенный выше запрос?

2. @AT-2016: Нет, я обновил сообщение своим результатом…

Ответ №1:

Не стесняйтесь использовать круглые скобки

 SELECT 
    a.id, 
    a.name, 
    a.type, 
    (SELECT COUNT(*) FROM data 
        WHERE type='city' AND county=a.county) AS included 
FROM data AS a 
WHERE 
    a.state='Rheinland-Pfalz' AND 
    (a.type='county' OR (a.type='city' AND a.county IS NULL));
  

Комментарии:

1. А Ш Е С О М Е! Большое спасибо! Было не так уж далеко 🙂

Ответ №2:

один из способов, которым вы могли бы попробовать предложение group — не проверено:

 select count(*) from data where type in ('state','County') where
   state = 'Rheinland-Pfalz' group by type,state;  
  

Также следует учитывать, что значения ID или подробные значения уровня поля не будут отображаться в подсчетах

Комментарии:

1. Попробуйте добавить поля в тычинки выбора и сгруппировать по ним — поля уровня детализации, такие как идентификаторы, не должны включаться

2. …Выберите имя, тип, количество (*) … Группируйте по имени, введите