MySQL结果作为逗号分隔的列表。

11 浏览
0 Comments

MySQL结果作为逗号分隔的列表。

我需要运行这样一个查询:

SELECT p.id, p.name, 
       (SELECT name 
          FROM sites s 
         WHERE s.id = p.site_id) AS site_list
  FROM publications p

但是我希望子查询返回一个逗号分隔的列表,而不是一列数据。这种方式是否可行,如果可行,如何实现?

0
0 Comments

MySQL中的问题: 将MySQL结果作为逗号分隔的列表输出,出现的原因是GROUP_CONCAT()函数在GROUP BY情况下无法正常工作。

解决方法是使用concat()函数代替group_concat()函数。

例如,使用以下方式来实现将结果作为逗号分隔的列表输出:

Select concat(Col1, ',', Col2) as Foo_Bar from Table1;

需要注意的是,这种方法只适用于MySQL数据库。在Oracle数据库中,concat()函数只接受两个参数,可以使用如下方式实现将结果作为逗号分隔的列表输出:

select col1||','||col2||','||col3 as foobar from table1;

而在SQL Server中,可以使用+运算符来实现将结果作为逗号分隔的列表输出。

需要强调的是,这种方法不适用于GROUP BY情况,因为GROUP_CONCAT()函数可以将单个列的内容连接起来。

0
0 Comments

MySQL Results as comma separated list问题的出现原因是想要将查询结果以逗号分隔的形式进行显示。解决方法是使用MySQL的GROUP_CONCAT函数。

GROUP_CONCAT函数可以将多个行的值连接成一个字符串,并用指定的分隔符进行分隔。下面是一些使用GROUP_CONCAT函数的示例:

1. 简单的GROUP_CONCAT:

SELECT GROUP_CONCAT(TaskName) 
FROM Tasks;

结果:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

2. 使用DISTINCT关键字的GROUP_CONCAT:

SELECT GROUP_CONCAT(DISTINCT TaskName) 
FROM Tasks;

结果:

+------------------------------------------------------------------+
| GROUP_CONCAT(TaskName)                                           |
+------------------------------------------------------------------+
| Do garden,Feed cats,Paint roof,Take dog for walk,Relax,Feed cats |
+------------------------------------------------------------------+

3. 使用DISTINCT和ORDER BY的GROUP_CONCAT:

SELECT GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) 
FROM Tasks;

结果:

+--------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName ORDER BY TaskName DESC) |
+--------------------------------------------------------+
| Take dog for walk,Relax,Paint roof,Feed cats,Do garden |
+--------------------------------------------------------+

4. 使用DISTINCT、SEPARATOR的GROUP_CONCAT:

SELECT GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ') 
FROM Tasks;

结果:

+----------------------------------------------------------------+
| GROUP_CONCAT(DISTINCT TaskName SEPARATOR ' + ')                |
+----------------------------------------------------------------+
| Do garden + Feed cats + Paint roof + Relax + Take dog for walk |
+----------------------------------------------------------------+

5. 合并多个列的GROUP_CONCAT:

SELECT GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ') 
FROM Tasks;

结果:

+------------------------------------------------------------------------------------+
| GROUP_CONCAT(TaskId, ') ', TaskName SEPARATOR ' ')                                 |
+------------------------------------------------------------------------------------+
| 1) Do garden 2) Feed cats 3) Paint roof 4) Take dog for walk 5) Relax 6) Feed cats |
+------------------------------------------------------------------------------------+

6. 使用GROUP_CONCAT和GROUP BY进行分组:

USE Music;
SELECT ar.ArtistName,
    GROUP_CONCAT(al.AlbumName)
FROM Artists ar
INNER JOIN Albums al
ON ar.ArtistId = al.ArtistId
GROUP BY ArtistName;

结果:

+------------------------+----------------------------------------------------------------------------+
| ArtistName             | GROUP_CONCAT(al.AlbumName)                                                 |
+------------------------+----------------------------------------------------------------------------+
| AC/DC                  | Powerage                                                                   |
| Allan Holdsworth       | All Night Wrong,The Sixteen Men of Tain                                    |
| Buddy Rich             | Big Swing Face                                                             |
| Devin Townsend         | Epicloud,Ziltoid the Omniscient,Casualties of Cool                         |
| Iron Maiden            | Somewhere in Time,Piece of Mind,Powerslave,Killers,No Prayer for the Dying |
| Jim Reeves             | Singing Down the Lane                                                      |
| Michael Learns to Rock | Eternity,Scandinavia,Blue Night                                            |
| The Script             | No Sound Without Silence                                                   |
| Tom Jones              | Long Lost Suitcase,Praise and Blame,Along Came Jones                       |
+------------------------+----------------------------------------------------------------------------+

需要注意的是,GROUP_CONCAT函数有一个限制,可能不能将超过65个结果连接在一起。

0
0 Comments

MySQL Results as comma separated list问题的出现原因是需要将MySQL的查询结果以逗号分隔的形式输出。解决方法是使用GROUP_CONCAT函数来实现。

在MySQL中,可以使用GROUP_CONCAT函数来将多个值连接成一个字符串。例如,在给定的示例中,可以使用以下查询语句来实现这个目标:

SELECT p.id, p.name, GROUP_CONCAT(s.name) AS site_list
FROM sites s
INNER JOIN publications p ON(s.id = p.site_id)
GROUP BY p.id, p.name;

这个查询语句将sites表和publications表进行内连接,并使用GROUP_CONCAT函数将每个publication的name字段值连接成一个字符串。通过使用GROUP BY子句来对结果进行分组,可以确保每个publication只出现一次。

需要注意的是,如果在使用PHPMyAdmin输出到页面时,想要得到逗号分隔的列表,需要使用GROUP_CONCAT(CAST(s.name AS CHAR)),否则会返回一些无用的内容,比如[BLOB - 20 Bytes]

在使用GROUP BY时需要注意,选择列表中的项必须在GROUP BY子句的上下文中是有效的聚合。在给定的示例中,p.name在严格意义上不是有效的聚合项。符合SQL标准的任何数据库都会将其视为错误。对于这种情况,可以在选择列表中使用MAX(p.name),或将p.name添加到GROUP BY子句中。由于Paul可能是想要用p.id来表示主键或唯一键,将p.name添加到GROUP BY子句中对最终结果没有影响。

需要注意的是,可能需要根据需要设置会话的最大长度。可以参考stackoverflow上的相关问题了解更多信息。

0