SQL возвращает ORDER BY результат в виде массива - PullRequest
3 голосов
/ 02 июня 2010

Можно ли возвращать группы в виде ассоциативного массива? Я хотел бы знать, возможно ли чисто SQL-решение. Обратите внимание, что я сообщаю, что могу без необходимости усложнять ситуацию, но это главным образом для того, чтобы дать мне представление о силе SQL.

Моя проблема: у меня есть список слов в базе данных, которые должны быть отсортированы в алфавитном порядке и сгруппированы в отдельные группы по первой букве слова.

Например:

ape
broom
coconut
banana
apple

должно быть возвращено как

array(
'a' => 'ape', 'apple',
'b' => 'banana', 'broom',
'c' => 'coconut'
)

, поэтому я могу легко создавать отсортированные списки по первой букве (т. Е. При нажатии «A» отображаются только слова, начинающиеся с «a», «B» с «b» и т. Д.) Это должно упростить мне загрузку всего в одном запросе и отсортированный список на основе JavaScript, т. е. без перезагрузки страницы (или использования AJAX).

Примечания: я использую PostgreSQL, но решение для MySQL тоже подойдет, поэтому я могу попробовать перенести его на PostgreSQL. Язык сценариев - PHP.

Ответы [ 4 ]

6 голосов
/ 02 июня 2010

MySQL:

SELECT LEFT(word, 1) AS first_letter, 
  GROUP_CONCAT(word) AS word_list
FROM MyTable
GROUP BY LEFT(word, 1);

PostgreSQL 8.4:

SELECT SUBSTRING(word FOR 1) AS first_letter, 
  ARRAY_TO_STRING(ARRAY_AGG(word), ',') AS word_list
FROM MyTable
GROUP BY SUBSTRING(word FOR 1);

См. http://mssql -to-postgresql.blogspot.com / 2007/12 / cool-groupconcat.html для получения дополнительной информации об эмуляции MySQL GROUP_CONCAT() в PostgreSQL.

Подробнее о ARRAY_AGG().

см. http://www.postgresonline.com/journal/index.php?/archives/126-PostgreSQL-8.4-Faster-array-building-with-array_agg.html.
0 голосов
/ 02 июня 2010

Вы знакомы с синтаксисом LIKE?

как в

SELECT * FROM words WHERE col LIKE a% ORDER BY col

даст вам все по порядку и так далее. Создайте хеш соответственно.

0 голосов
/ 02 июня 2010

Я не эксперт по PostgreSQL (или пользователь), но я верю, что в более поздних версиях вы можете сделать что-то вроде этого:

SELECT 
    ROW_NUMBER() OVER (PARTITION BY SUBSTRING(whatever from 1 for 1) ORDER BY whatever) AS __ROW,
    whatever
FROM yourtable;

Это ANSI SQL. Я еще не знаю, на что похожа поддержка MySql. Oracle и SQL Server работают с этим синтаксисом, и через Google я узнал, что PostgreSQL 8.4 поддерживает оконные функции.

0 голосов
/ 02 июня 2010

Выполнить 26 отдельных запросов. Или выполните один запрос и разделите результаты в алфавитном порядке на стороне сервера.

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