SQL Server 2005
我有一张返回的表
ID name prop value
--------------------------
1 one Prop1 a
1 one Prop1 b
1 one Prop2 c
2 two Prop1 d
2 two Prop2 e
Run Code Online (Sandbox Code Playgroud)
我如何对其运行选择以返回
ID name prop value
-----------------------------
1 one Prop1 a,b
1 one Prop2 c
2 two Prop1 d
2 two Prop2 e
Run Code Online (Sandbox Code Playgroud) 我遇到了在这种情况下使用UNION和GROUP_CONCAT的正确语法的问题:
我有4张桌子:
'base'表中的记录可以通过mm表在t1和t2中有许多相关记录.
我在MySQL中创建一个VIEW,我需要将所有相关记录显示在一个用逗号分隔的列中.
这是基本的MySQL代码:
SELECT base.uid, t1.nombre_es
FROM base
INNER JOIN mm
ON mm.uid_local=base.uid
INNER JOIN t1
ON mm.uid_foreign=t1.uid WHERE mm.tablenames = 't1'
UNION
SELECT base.uid, t2.nombre_es
FROM base
INNER JOIN mm
ON mm.uid_local=base.uid
INNER JOIN t2
ON mm.uid_foreign=t2.uid WHERE mm.tablenames = 't2'
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我可以使用两个VIEWS,第一个使用上面的代码,名称为'viewtest',第二个使用此代码:
SELECT base.uid,
GROUP_CONCAT(DISTINCT vi.nombre_es ORDER BY vi.nombre_es SEPARATOR ',') as nombre
FROM base
INNER JOIN viewtest as vi
ON vi.uid=base.uid
GROUP BY uid
Run Code Online (Sandbox Code Playgroud)
现在的问题是¿如何在一个视图中加入这两个视图?
我有一个查询,如下,应该有效。但是,MySQL 给了我错误消息
子查询返回多行
SELECT e.episode_pk,
(SELECT GROUP_CONCAT(d.fulldescription separator ', ')
FROM episode_rhythm er
JOIN diagnosis d ON er.diagnosis_fk = d.diagnosis_pk
WHERE er.episode_fk = e.episode_pk
GROUP BY d.fulldescription) as rhythmDesc
FROM episode e
WHERE e.patientid_fk = '89976';
Run Code Online (Sandbox Code Playgroud)
在此查询中使用 的全部目的GROUP_CONCAT是每个“情节”仅返回一行。
外部选择返回多行。
当针对单个剧集表主键运行时,内部SELECT会返回一行,正如您所怀疑的:
SELECT group_concat(d.fulldescription separator ', ')
FROM episode_rhythm er
JOIN diagnosis d ON er.diagnosis_fk = d.diagnosis_pk
WHERE er.episode_fk = 234776
GROUP BY d.fulldescription;
Run Code Online (Sandbox Code Playgroud)
当针对单个剧集表主键运行时,SELECT不带 的内部可能会返回多行:GROUP_CONCAT
SELECT d.fulldescription
FROM episode_rhythm er
JOIN diagnosis d ON …Run Code Online (Sandbox Code Playgroud) 有没有办法只选择具有除前一个选定行之外的其他结果的行?在我的一个表中,我存储广告数据,即每个广告一行.我还在另一个表中存储每个dag,周,月的租金价格,该表每个广告包含多个行.我想从表2中选择其中一个价格(在表2中的示例行1和3中)与数据选择在同一查询中发生变化的行.我知道在这种情况下我必须使用GROUP_CONCAT来获取一行而不是2行结果,但是如何从表2获得2个结果行,总共得到1个结果行?
查询的结果必须类似于:tre,234,"12345678911,12,45,32555676711,12,67"
Table 1 (advertisements)
ID_adv data1 data2
1 tre 234
2 ghj 34
3 jk 098
4 jfjk 12
Table 2 (dates)
ID_dates ID_adv timestamp_day price1 price2
1 1 12345678911 12 45
2 1 22345677771 12 45
3 1 32555678911 12 67
4 2 42345671231 34 34
Run Code Online (Sandbox Code Playgroud)
我试过了
SELECT
t1.*,
GROUP_CONCAT(t2.date) AS dates
FROM Table1 t1
LEFT JOIN Table2 t2 ON t2.ID_adv = t1.ID_adv
WHERE t1.ID_adv = 3 GROUP BY t1.ID_adv
Run Code Online (Sandbox Code Playgroud) 关于使用group_concat连接表有问题.这是详细信息.
table_orders:
item_cd order_id descs quantity status seq_no
1 100 coca-cola 2 A 232
2 100 pizza 1 A 233
3 101 cheeseburger 5 A 234
4 102 pepsi 4 A 235
4
Run Code Online (Sandbox Code Playgroud)
table_instructions:
item_cd instruction
3 more cheese
3 less vegetable
Run Code Online (Sandbox Code Playgroud)
cancelled_item_table:
quantity seq_no
1 234
1 234
1 235
Run Code Online (Sandbox Code Playgroud)
现在我想要实现的是这样的:
item_cd descs quantity instructions cancelled_item
1 coca-cola 2 - -
2 pizza 1 - -
3 cheeseburger 2 more cheese, less vegetable 1,1
4 pepsi 4 - 1 …Run Code Online (Sandbox Code Playgroud) 我有两张用 UNION ALL 查询的表 - 一张用于 Android,一张用于 iPhone。每个表都有自己的设备字段(“android”或“iphone”)。
我使用GROUP_CONCAT(DISTINCT `device` ORDER BY `device` SEPARATOR ', ') AS `device`了几次,每次当我按另一列(例如日期、用户 ID 等)分组时。我也使用相同的 GROUP_CONCAT 来计算总数。
问题是,当我按日期分组时,我选择设备的 GROUP_CONCAT(不是直接设备),因为有些日期同时购买了 Android 和 iPhone。选择还包括 WHERE 或 HAVING 以让用户按特定日期、加入日期的用户数量等进行过滤。当我计算总数时,我在设备上有 GROUP_CONCAT,它本身就是一个 GROUP_CONCAT 函数。结果可能类似于“android, android, iphone, iphone”,因为有只有 Android 的日期、只有 iPhone 的日期和两者都有的日期(其他查询只能有这些选项中的一个或一些)。我正在寻找一种方法将此结果转换为“android, iphone”。
目前我正在使用一个 PHP 函数:
private function get_device_human_string($fp_device_computer_string)
{
$devices= array(
'android' => 'Android',
'iphone' => 'iPhone'
);
$device_computer_string= strtolower($fp_device_computer_string);
$ret= array();
foreach ($devices as $device_key => $device_human_string)
{
if (strpos($device_computer_string, $device_key) !== false)
{
$ret[]= $device_human_string;
} …Run Code Online (Sandbox Code Playgroud) 我知道 postgres 没有 group_concat,但我想通过使用 string_agg(或任何其他有效的方式)来模拟它的字符串。
由于无法更改遗留代码,我需要使用名为 group_concat 的函数。
我怎样才能做到这一点?
对于它的价值,我还尝试group_concat使用常规 concat 来实现,但也遇到了错误:
CREATE AGGREGATE group_concat (text) (sfunc = concat, stype=text)
Run Code Online (Sandbox Code Playgroud)
错误:
“函数 concat(text,text) 不存在”
在 MySQL 5.7 中,我们有 JSON_ARRAY 对象。我想执行类似于 a 的操作SELECT GROUP_CONCAT(field),但将结果放入 JSON_ARRAY 中。
我当前的查询是:
SELECT GROUP_CONCAT(name) FROM users;
Run Code Online (Sandbox Code Playgroud)
结果:约翰、迈克尔、索菲亚
我希望结果是: ["john","michael","sofia"]
我当前的解决方案是:
select @j:=json_array_append(@j,'$',name) from users
Run Code Online (Sandbox Code Playgroud)
但这非常低效,因为它会为每一行重新计算。是否有可能更有效地实现这一目标?
SQL ......
UPDATE Threads t
SET t.Content = (
SELECT GROUP_CONCAT(a.Content ORDER BY a.PageID SEPARATOR '<!-- pagebreak -->')
FROM MSarticlepages a
WHERE a.ArticleID = t.MSthreadID GROUP BY a.ArticleID
)
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它将所有文章的页面(每个页面都作为longtext存储在不同的行中)和GROUP_CONCAT将它们放入单个longtext行中.问题是结果只有很多字符然后被完全截断,丢失了大约90%的内容.CONCAT不能很好地处理longtext,还是还有其他我做错的事情?
问题是获取表列数据并将其用作IN函数的值列表;
在这个例子中,我创建了2个表:电影和流派
表"电影"包含3列:id,name和流派.表"genres"包含2列:id和name.
+- movies-+
| |- movie_id - int(11) - AUTO_INCREMENT - PRIMARY
| |- movie_name - varchar(255)
| |- movie_genres - varchar(255)
|
|
+- genres-+
|- genre_id - int(11) - AUTO_INCREMENT - PRIMARY
|- genre_name - varchar(255)
Run Code Online (Sandbox Code Playgroud)
两个表都包含一些虚拟数据:
+----------+------------+--------------+
| movie_id | movie_name | movie_genres |
+----------+------------+--------------+
| 1 | MOVIE 1 | 2,3,1 |
| 2 | MOVIE 2 | 2,4 |
| 3 | MOVIE 3 | 1,3 |
| 4 | MOVIE 4 | …Run Code Online (Sandbox Code Playgroud) group-concat ×10
mysql ×8
sql ×3
arrays ×1
csv ×1
distinct ×1
group-by ×1
longtext ×1
postgresql ×1
sql-server ×1
subquery ×1
syntax ×1
t-sql ×1
truncated ×1
union ×1