2012-03-13 3 views
2

У меня есть «firstname» и «lastname», хранящиеся в таблице пользователей.Поиск уникальных первых букв из двух столбцов в SQL-запросе

Я пытаюсь создать список букв A-Z и знаю, для каждой буквы, есть ли хотя бы один пользователь с их первой буквой, начинающейся с этой буквы, или нет. Идеальный выход запроса будет просто A, B, C, D, E, I, O, U, например, хотя и счастлив опубликовать процесс.

я могу сделать это достаточно легко на одной колонке:

SELECT COUNT(*), LEFT(firstname, 1) FROM users GROUP BY LEFT(firstname, 1) 

, но это только один столбец, и я хотел бы сделать это для двух столбцов. Кроме того, если есть более эффективный способ сделать это - я хотел бы узнать.

ответ

3

Если вы хотите, чтобы данные из двух столбцов, вы должны использовать UNION:

SELECT LEFT(firstname, 1) 
    FROM users 
UNION 
SELECT LEFT(lastname, 1) 
    FROM users 

Оператор UNION выбирает различные значения по умолчанию, так что вам не нужно использовать DISTINCT в вашем ЗЕЬЕСТЕ.

2

Для комбинированного подсчета, попробуйте:

select count(*), letter from 
(select LEFT(firstname, 1) letter from users UNION ALL 
select LEFT(lastname, 1) letter from users) 
group by letter 

Для отдельных подсчетов, попробуйте:

select sum(firstname_count), sum(lastname_count), letter from 
(select LEFT(firstname, 1) letter, 1 firstname_count, 0 lastname_count from users 
UNION ALL 
select LEFT(lastname, 1) letter, 0 firstname_count, 1 lastname_count from users) 
group by letter 
+0

Большое спасибо; Я вижу, как это работает. Моим идеальным решением было бы избежать подзапросов только потому, что это не будет работать против индекса; но если это невозможно, это сделает это. –

+0

Можно ли использовать функциональные индексы в MySQL? Если так, то в этом случае это может стоить. Если нет, то, возможно, стоит добавить столбец, хранящий только 1-й начальный номер и обновление, которое через триггер. –

Смежные вопросы