2013-08-28 7 views
1

Я делаю простой MySQL Query и хотел бы использовать GROUP, чтобы дать мне набор результатов для всех моих местоположений, а не запускать запрос, раскомментируя различные строки в каждом случае. Я смущен тем, следует ли использовать GROUP в предложении SELECT или WHERE.Группировка результатов в MySQL

SELECT COUNT(*) FROM 
Users AS u 
-- Northern Ireland 
WHERE u.postcode_area IN ('BT') 
-- WALES 
-- WHERE u.postcode_area IN ('CF','CH','GL') 
-- Scotland 
-- WHERE u.postcode_area IN ('AB','DD','DG','EH','FK') 

Так как результат я хотел бы видеть

  • Северной Ирландии | 25678
  • Уэльс | 34543
  • Шотландия | 4567
+0

Ну , у вас наверняка есть таблицы для отношений между «BT» и «Northern Ireland» и «CF», «CH», «GL» и «Wales», не так ли? Так вы можете показать эту часть своей структуры? –

+0

Привет, спасибо, что ответили. Здесь нет реляционных таблиц, Северная Ирландия, Уэльс и Шотландия - это просто ярлыки. Спасибо – Boomfelled

+0

Я бы все же был хорошей идеей для этой реляционной таблицы. Он будет поддерживать ваш запрос в обслуживании, и вы никогда не узнаете, когда вам еще понадобятся одни и те же данные в другом месте. –

ответ

2

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

SELECT 
    (CASE 
     WHEN u.postcode_area IN ('BT') THEN 'Northern Ireland' 
     WHEN u.postcode_area IN ('CF','CH','GL') THEN 'WALES' 
     WHEN u.postcode_area IN ('AB','DD','DG','EH','FK') THEN 'Scotland' 
     ELSE 'other') AS country, 
    COUNT(*) 
FROM 
    Users AS u 
GROUP BY country 
+0

Отлично, спасибо большое, просто не хватает END с CASE. ;-) – Boomfelled

1

Вы можете просто попробовать это так:

select 
    if(u.postcode_area in ('BT'), 'Northern Ireland', 
    if(u.postcode_area in ('CF','CH','GL'), 'Wales', 
     if(u.postcode_area in ('AB','DD','DG','EH','FK'), 'Scotland', 
     'Unknown' 
    ) 
    ) 
) as label 
    , count(*) 
from Users as u 
group by label 

редактировать:

Кстати, было бы чтобы иметь таблицу, содержащую postcode_area, связанную с меткой.

Северная Ирландия | BT
Уэльс | CF
Уэльс | CH
Уэльс | GL
Шотландия | AB
Шотландия | DD
Шотландия | DG
Шотландия | EH
Шотландия | FK

тогда ваш запрос будет:

select 
    pl.label, 
    count(*) as count 
from 
    Users as u 
    inner join containing postcode_area_label as pl 
    on u.postcode_area = pl.postcode_area 
group by 
    pl.label 
+0

Случай xdazz выглядит более аккуратно, чем вложенный, если я использую. Для остальных это то же самое –

+0

Спасибо, наша база данных настроена, как вы предлагаете. Мне просто нужен пример для предложения GROUP. Еще раз спасибо за ваш вклад. – Boomfelled

1

Это даст все три результата, в то же время:

SELECT ireland.ireland_count, wales.wales_count, scotland.scotland_count FROM 
(SELECT COUNT(*) as ireland_count FROM Users WHERE postcode_area IN ('BT')) as ireland 
JOIN 
(SELECT COUNT(*) as wales_count FROM Users WHERE postcode_area IN ('CF','CH','GL')) as wales 
JOIN 
(SELECT COUNT(*) as scotland_count FROM Users WHERE postcode_area IN ('AB','DD','DG','EH','FK')) as scotland; 

Выход будет как:

ireland_count | wales_count | scotland_count 
25678   | 34543   | 4567