标签: group-concat

MySQL:带有LEFT JOIN的GROUP_CONCAT

我遇到了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)

mysql sql join aggregate-functions group-concat

50
推荐指数
2
解决办法
4万
查看次数

mysql GROUP_CONCAT重复

我从像这样的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)

mysql sql group-concat

42
推荐指数
1
解决办法
3万
查看次数

如何使用group-concat mysql创建json格式?

如何使用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)

谢谢

mysql sql group-concat

42
推荐指数
6
解决办法
4万
查看次数

GROUP_CONCAT有限制

我有表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 group-concat

42
推荐指数
5
解决办法
6万
查看次数

在MySQL中的子查询上使用GROUP_CONCAT

我有一个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要求.

mysql sql group-concat mysql-error-1242

41
推荐指数
2
解决办法
7万
查看次数

Sqlite group_concat命令

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

我怎样才能做到这一点?

sqlite group-concat

40
推荐指数
2
解决办法
2万
查看次数

MySQL使用逗号分隔值连接两个表

我有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)

php mysql left-join group-concat find-in-set

38
推荐指数
2
解决办法
3万
查看次数

如何将子查询中的字符串连接到mysql中的单个行?

我有三张桌子:

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 …

mysql concat list subquery group-concat

34
推荐指数
1
解决办法
5万
查看次数

MySQL在group by之后获得第一个非null值

我有一个大表,数据不是唯一但需要.此表是多个联合选择的结果,因此不是实际表.由于其他原因,我不能把它变成一张真正的桌子.

所有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 emailNOT NULL每行的每一列中选择第一个条目,理论上如下:

1   ozzy@test.com   Ozzy
2   test@test.com   Tony
3   test@yahoo.com …
Run Code Online (Sandbox Code Playgroud)

mysql group-by group-concat

31
推荐指数
1
解决办法
1万
查看次数

在Oracle中连接并分组多行

可能重复:
如何在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)

sql oracle grouping concatenation group-concat

30
推荐指数
1
解决办法
8万
查看次数