我遇到了MySQL的"GROUP_CONCAT"功能问题.我将使用一个简单的帮助台数据库来说明我的问题:
CREATE TABLE Tickets (
id INTEGER NOT NULL PRIMARY KEY,
requester_name VARCHAR(255) NOT NULL,
description TEXT NOT NULL);
CREATE TABLE Solutions (
id INTEGER NOT NULL PRIMARY KEY,
ticket_id INTEGER NOT NULL,
technician_name VARCHAR(255) NOT NULL,
solution TEXT NOT NULL,
FOREIGN KEY (ticket_id) REFERENCES Tickets.id);
INSERT INTO Tickets VALUES(1, 'John Doe', 'My computer is not booting.');
INSERT INTO Tickets VALUES(2, 'Jane Doe', 'My browser keeps crashing.');
INSERT INTO Solutions VALUES(1, 1, 'Technician A', 'I tried to solve this but …Run Code Online (Sandbox Code Playgroud) 我从像这样的farmTOanimal表中进行连接.有一个类似的farmTotool表
id | FarmID | animal
1 | 1 | cat
2 | 1 | dog
Run Code Online (Sandbox Code Playgroud)
当我在视图中加入我的表时,我得到一个看起来像这样的结果
FarmID | animal | tool
1 | cat | shovel
1 | dog | shovel
1 | cat | bucket
1 | dog | bucket
Run Code Online (Sandbox Code Playgroud)
现在,我做GROUP BY FarmID,GROUP_CONCAT(动物)和GROUP_CONCAT(工具),我得到
FarmID | animals | tools
1 | cat,dog,cat,dog | shovel,shovel,bucket,bucket
Run Code Online (Sandbox Code Playgroud)
但是,我真正想要的是一个看起来像这样的结果.我该怎么做?
FarmID | animals | tools
1 | cat,dog | shovel,bucket
Run Code Online (Sandbox Code Playgroud) 如何使用group-concat mysql创建json格式?
(我使用MySQL)
例1:
表格1:
email | name | phone
-------------------------------------
my1@gmail.com | Ben | 6555333
my2@gmail.com | Tom | 2322452
my2@gmail.com | Dan | 8768768
my1@gmail.com | Joi | 3434356
Run Code Online (Sandbox Code Playgroud)
像语法代码,不给我格式:
select email, group-concat(name,phone) as list from table1 group by email
我需要的输出:
email | list
------------------------------------------------
my1@gmail.com | {name:"Ben",phone:"6555333"},{name:"Joi",phone:"3434356"}
my2@gmail.com | {name:"Tom",phone:"2322452"},{name:"Dan",phone:"8768768"}
Run Code Online (Sandbox Code Playgroud)
谢谢
我有表player-s在许多一对多的关系与skill-s
目标是通过单个查询列出球员及其"前3名技能".
create table player(
id int primary key
);
create table skill(
id int primary key,
title varchar(100)
);
create table player_skills (
id int primary key,
player_id int,
skill_id int,
value int
);
Run Code Online (Sandbox Code Playgroud)
查询:
SELECT
p.id,
group_concat(s.title SEPARATOR ', ') as skills
FROM player p
LEFT JOIN player_skills ps ON ps.player_id = p.id
LEFT JOIN skill s ON s.id = ps.skill_id
WHERE ps.value > 2
-- skills limit 3 some how ...
group …Run Code Online (Sandbox Code Playgroud) 我有一个MySQL查询,我想在其中包含另一个表中的ID列表.在网站上,人们可以添加某些项目,然后人们可以将这些项目添加到他们的收藏夹中.我基本上想要获得那些喜欢该项目的人的ID列表(这有点简化,但这就是它归结为).
基本上,我做这样的事情:
SELECT *,
GROUP_CONCAT((SELECT userid FROM favourites WHERE itemid = items.id) SEPARATOR ',') AS idlist
FROM items
WHERE id = $someid
Run Code Online (Sandbox Code Playgroud)
通过这种方式,我可以通过在我的代码中进一步将id列表转换为PHP中的数组来显示谁喜欢某个项目,但是我收到以下MySQL错误:
1242 - 子查询返回超过1行
我认为这有点使用GROUP_CONCAT而不是,例如,CONCAT?我是以错误的方式来做这件事的吗?
好的,感谢到目前为止的答案,这似乎有效.然而,有一个问题.如果该项目由该用户添加,则该项目也被视为最受欢迎.所以我需要额外的检查以检查creator = userid.有人可以帮我提出一个聪明(并希望有效)的方法吗?
谢谢!
编辑:我只是试图这样做:
SELECT [...] LEFT JOIN favourites ON (userid = itemid OR creator = userid)
Run Code Online (Sandbox Code Playgroud)
而IDLIST是空的.请注意,如果我使用INNER JOIN而不是LEFT JOIN我得到一个空的结果.即使我确信有些行符合ON要求.
在Sqlite中我可以使用group_concat来做:
1...A
1...B
1...C
2...A
2...B
2...C
1...C,B,A
2...C,B,A
Run Code Online (Sandbox Code Playgroud)
但根据文档,连接的顺序是随机的.
我需要将group_concat的输出排序为
1...A,B,C
2...A,B,C
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?
我有2个表格如下
备注表
??????????????????????????????
? nid ? forDepts ?
??????????????????????????????
? 1 ? 1,2,4 ?
? 2 ? 4,5 ?
??????????????????????????????
Run Code Online (Sandbox Code Playgroud)
职位表
??????????????????????????????
? id ? name ?
??????????????????????????????
? 1 ? Executive ?
? 2 ? Corp Admin ?
? 3 ? Sales ?
? 4 ? Art ?
? 5 ? Marketing ?
??????????????????????????????
Run Code Online (Sandbox Code Playgroud)
我希望查询我的Notes表并将'forDepts'列与Positions表中的值相关联.
输出应该是:
?????????????????????????????????????????
? 1 ? Executive, Corp Admin, Art ?
? 2 ? Art, Marketing ?
?????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
我知道数据库应该规范化,但我无法更改此项目的数据库结构.
这将用于导出带有以下代码的excel文件.
<?PHP
$dbh1 = mysql_connect($hostname, $username, …Run Code Online (Sandbox Code Playgroud) 我有三张桌子:
table "package"
-----------------------------------------------------
package_id int(10) primary key, auto-increment
package_name varchar(255)
price decimal(10,2)
table "zones"
------------------------------------------------------
zone_id varchar(32) primary key (ex of data: A1, Z2, E3, etc)
table "package_zones"
------------------------------------------------------
package_id int(10)
zone_id varchar(32)
Run Code Online (Sandbox Code Playgroud)
我要做的是返回包表中的所有信息PLUS该包的区域列表.我希望区域列表按字母顺序排序并以逗号分隔.
所以我正在寻找的输出是这样的......
+------------+---------------+--------+----------------+
| package_id | package_name | price | zone_list |
+------------+---------------+--------+----------------+
| 1 | Red Package | 50.00 | Z1,Z2,Z3 |
| 2 | Blue Package | 75.00 | A2,D4,Z1,Z2 |
| 3 | Green Package | 100.00 | B4,D1,D2,X1,Z1 |
+------------+---------------+--------+----------------+
Run Code Online (Sandbox Code Playgroud)
我知道我可以在PHP中使用表示层来完成所需的结果.问题是,我希望能够对zone_list ASC或DESC进行排序,甚至使用"WHERE …
我有一个大表,数据不是唯一但需要.此表是多个联合选择的结果,因此不是实际表.由于其他原因,我不能把它变成一张真正的桌子.
所有UNION表都有一个电子邮件列,最终将是唯一的.结果记录如下所示:
1 ozzy@test.com Ozzy
2 test@test.com Tony
3 test@yahoo.com Steve
4 tiny@test.com
13 tony@gmail.com Tony
14 test@test.com Ozzy
15 test@yahoo.com Dave
16 tiny@test.com Tim
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,有些电子邮件会以不同的名称或不存在的名称出现.当我GROUP BY email在最后添加一个子句时,结果如下所示:
1 ozzy@test.com Ozzy
2 test@test.com Tony
3 test@yahoo.com Steve
4 tiny@test.com
13 tony@gmail.com Tony
Run Code Online (Sandbox Code Playgroud)
如您所见,电子邮件4没有名称,因为它选择了名称的第一个条目NULL.然后我尝试使用GROUP_CONCAT哪个使结果看起来像这样:
1 ozzy@test.com Ozzy
14 test@test.com Ozzy,Tony
15 test@yahoo.com Dave,Steve
16 tiny@test.com Tim
13 tony@gmail.com Tony
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,现在每个人都有一个名称,但有些行有多个名称已连接.我想要做的是GROUP BY email从NOT NULL每行的每一列中选择第一个条目,理论上如下:
1 ozzy@test.com Ozzy
2 test@test.com Tony
3 test@yahoo.com …Run Code Online (Sandbox Code Playgroud) 可能重复:
如何在Oracle中以A,B格式检索两列数据
假设我有一个这样的表:
NAME GROUP_NAME
name1 groupA
name2 groupB
name5 groupC
name4 groupA
name3 groupC
Run Code Online (Sandbox Code Playgroud)
我想得到这样的结果:
GROUP_NAME NAMES
groupA name1,name4
groupB name2
groupC name3,name5
Run Code Online (Sandbox Code Playgroud)
如果表中只有一列,我可以通过执行以下操作来连接记录,但是在上下文中进行分组时,我真的没有太多想法.
连接一个列表:
SELECT names
FROM (SELECT SYS_CONNECT_BY_PATH(names,' ') names, level
FROM name_table
START WITH names = (SELECT names FROM name_table WHERE rownum = 1)
CONNECT BY PRIOR names < names
ORDER BY level DESC)
WHERE rownum = 1
Run Code Online (Sandbox Code Playgroud)
我现在有一个解决方案LISTAGG:
SELECT
group_name,
LISTAGG(name, ', ')
WITHIN GROUP (ORDER BY GROUP) "names"
FROM name_table
GROUP …Run Code Online (Sandbox Code Playgroud)