SQL将ORDER BY结果作为数组返回

时间:2010-06-01 23:50:27

标签: php sql mysql postgresql

是否可以将组作为关联数组返回?我想知道是否可以使用纯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 个答案:

答案 0 :(得分:6)

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);

有关在PostgreSQL中模拟MySQL GROUP_CONCAT()的更多信息,请参阅http://mssql-to-postgresql.blogspot.com/2007/12/cool-groupconcat.html

有关ARRAY_AGG()的更多信息,请参阅http://www.postgresonline.com/journal/index.php?/archives/126-PostgreSQL-8.4-Faster-array-building-with-array_agg.html

答案 1 :(得分:0)

运行26个单独的查询。或者运行一个查询并按字母顺序将服务器端分开。

答案 2 :(得分:0)

您熟悉LIKE语法吗?

,如

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

会按顺序给你a等等。相应地构建哈希。

答案 3 :(得分:0)

我不是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支持窗口函数。