koj*_*ron 6 mysql sql join concatenation
我有两张桌子:
table_a: table_b
+----+------+ +----+---------+------+
| id | name | | id | relation| name |
+----+------+ ++++++---------+------+
| 1 | bob | | 1 | friend | chris|
| 2 | jim | | 1 | friend | jon |
| 3 | tom | | 1 | brother | matt |
+----+------+ | 2 | friend | sam |
| 2 | parent | ron |
+----+---------+------+
Run Code Online (Sandbox Code Playgroud)
我想输入一个查询输出类似的东西
+----+------+------------+---------+--------+
| id | name |friend | brother | parent |
+----+------+------------+---------+--------+
| 1 | bob | chris, john| matt | |
| 2 | jim | sam | | ron |
+----+------+------------+---------+--------+
Run Code Online (Sandbox Code Playgroud)
所以id是两个表之间的comman变量,关系变量有预设值(朋友,兄弟,父和其他几种类型),每个id每个关系可以有多个table_b.name.
这太复杂了吗?
SELECT a.ID, a.name,
GROUP_CONCAT(CASE WHEN relation = 'friend' THEN b.name ELSE NULL END) friend,
GROUP_CONCAT(CASE WHEN relation = 'brother' THEN b.name ELSE NULL END) brother,
GROUP_CONCAT(CASE WHEN relation = 'parent' THEN b.name ELSE NULL END) parent
FROM table_a a
INNER JOIN table_b b
ON a.id = b.id
GROUP BY a.ID, a.name
Run Code Online (Sandbox Code Playgroud)
将来,如果您有任何其他关系,并且friend, brother, and parent您不想更改查询,则可以使用准备好的语句
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'GROUP_CONCAT(CASE WHEN relation = ''',
relation,
''' then b.name ELSE NULL end) AS ',
relation
)
) INTO @sql
FROM table_b;
SET @sql = CONCAT('SELECT a.ID, a.name, ', @sql, '
FROM table_a a
INNER JOIN table_b b
ON a.id = b.id
GROUP BY a.ID, a.name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
213 次 |
| 最近记录: |