2014-10-29 2 views
0

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

A,12 
B,0 
C,20 
D,14 
E,0 
ect... 

таблица называется контакты, в приведенном выше было 12 вхождений людей, чьи имена начинаются с буквы а и там было 0 вхождений буквы Б.

Я надеюсь, что я объяснил это правильно

ответ

0

для того, чтобы результат, чтобы отобразить недостающие буквы, вам нужно вручную сгенерировать все буквы (например, с использованием подзапроса)

SELECT a.Letter, 
     COUNT(u.Name) AS TotalCount 
FROM 
     (
      SELECT 'A' Letter UNION ALL 
      SELECT 'B' Letter UNION ALL 
      SELECT 'C' Letter UNION ALL 
      -- until Z 
      SELECT 'Z' Letter 
     ) AS a 
     LEFT JOIN userList u 
      ON a.Letter = LEFT(u.Name, 1) -- <== column name 
GROUP BY a.Letter 
ORDER BY a.Letter 
+0

спасибо, но как добавить предложение where в список пользователей, но все равно сохранить нулевые буквы, я попытался добавить, где u.verified = 1 и B disapears – cghrmauritius

+0

вы должны добавить его в предложение 'ON'. например 'ON a.Letter = LEFT (u.Name, 1) AND u.verified = 1' –

0

Попробуйте это :

select substr(name, 1,1), count(*) from contacts group by substr(name, 1,1) 
+0

Что относительно букв в a lphabet, у которого есть счет нуля, как я показал в моем примере для буквы B, мне тоже нужно получить их? – cghrmauritius

0

Вы можете сделать как

select 
left(UPPER(firstname),1) as initial , 
count(*) as tot from users 
group by initial ; 

UPDATE, как вы хотите, чтобы показать символы, которые не существуют в списке, вы, возможно, потребуется посмотреть таблицу, а затем присоединиться к справочной таблицы. Эта таблица будет иметь только алфавитов

select 
a.alpha, 
coalesce(b.tot,0) as total 
from alphabets a 
left join 
(
    select 
    left(UPPER(firstname),1) as initial , 
    count(*) as tot from users 
    group by initial 
)b 
on b.initial = a.alpha 
; 

ИЛИ

select 
a.alpha, 
count(u.firstname) as tot 
from 
alphabets a 
left join users u on a.alpha = left(UPPER(u.firstname),1) 
group by a.alpha 

DEMO

0

Надежда так что это поможет.

SELECT LEFT(firstname,1) as character, COUNT(1) as totalCount 
FROM contacts 
GROUP BY initial ORDER BY firstname; 
0

Трудный путь также

SELECT 
'A' as letter , 
    count(*) as total FROM totalCount 
    WHERE left(UPPER(firstname),1)='A' 
    UNION 
    SELECT 
    'B' as letter , 
    count(*) as total FROM totalCount 
    WHERE left(UPPER(firstname),1)='B' 
    ..... 
    UNION 
    SELECT 
    'Z' as letter , 
    count(*) as total FROM totalCount 
    WHERE left(UPPER(firstname),1)='Z' 
0

Создать другая таблица

table_letter 
id letter 
1 A 
2 B 
3 C 
... 
26 Z 

SELECT a.letter, COUNT(b.name) as total 
FROM table_letter a 
LEFT JOIN contacts b 
ON a.letter = left(UPPER(b.name),1) 
GROUP BY a.letter