Извлечение результатов GROUP BY - PullRequest
3 голосов
/ 09 мая 2011

Допустим, у меня есть таблица, подобная этой:

name        | address
------------+----------------
JOHN SMITH  | 123 FAKE ST
JANE SMITH  | 123 FAKE ST
DAN JOHNSON | 456 WHATEVER RD

Теперь, скажем, я создаю представление, где я делаю GROUP BY address, в результате чего получается что-то вроде этого:

name                   | address         | group_id
-----------------------+-----------------+---------
JOHN SMITH, JANE SMITH | 123 FAKE ST     | 1
DAN JOHNSON            | 456 WHATEVER RD | 2

Есть ли способ, используя только SQL, «расширить» результаты этой группировки, как это?

name        | address         | group_id
------------+-----------------+---------
JOHN SMITH  | 123 FAKE ST     | 1
JANE SMITH  | 123 FAKE ST     | 1
DAN JOHNSON | 456 WHATEVER RD | 2

Ответы [ 3 ]

1 голос
/ 09 мая 2011

Один из вариантов - использовать функцию SUBSTRING_INDEX().

Проверьте это сообщение в блоге, где определена функция SPLIT_STRING(): mysql-split-string-function

0 голосов
/ 09 мая 2011

Да, как отметил ypercube, это возможно, и вам понадобится функция SUBSTRING_INDEX.Вам также нужно будет восстановить строки, что сложно, поскольку mysql не поддерживает рекурсивные запросы.

Вы можете обойти это решение, вот решение, предполагающее максимум 3 записи, просто для иллюстрации:

SELECT SUBSTRING_INDEX(name, ',', 1), address, group_id
FROM aggregated a1
WHERE
UNION ALL
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(name, ',', 2), ',', -1), address, group_id
FROM aggregated a2
WHERE name LIKE '%,%'
UNION ALL
SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(name, ',', 3), ',', -1), address, group_id
FROM aggregated a3
WHERE name LIKE '%,%,%'

Концептуальное уродство и недостатки вышеупомянутого подхода являются одной из причин, по которым вам никогда не рекомендуется делать это как обычную, продуманную процедуру в системе (производительность также никогда не будет хорошей): агрегирование записей считается частью уровня представления ине использовать для записи чего-либо обратно в базу данных и всегда иметь возможность извлекать записи из неагрегированного источника.

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

РЕДАКТИРОВАНИЕ: Я использовал термин агрегирование для group_concat (и аналогичных), что недостаточно конкретно.Было бы лучше сказать - хранение нескольких значений в одном поле (повторяющаяся группа в одном столбце).

0 голосов
/ 09 мая 2011

Используйте GROUP BY a.name. Почему вы хотите сгруппировать его по адресу?

В любом случае вы будете использовать WHERE a.address=b.address право!

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