【问题标题】:Mysql joins and concatenateMysql 连接和连接
【发布时间】:2012-10-13 08:04:45
【问题描述】:

我有两张桌子:

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  |
                 +----+---------+------+

我想输入一个查询来输出类似的东西

+----+------+------------+---------+--------+
| id | name |friend      | brother | parent |
+----+------+------------+---------+--------+
| 1  | bob  | chris, john| matt    |        |
| 2  | jim  | sam        |         |  ron   |
+----+------+------------+---------+--------+

所以id是两个表之间的comman变量, 关系变量具有预设值(朋友、兄弟、父母,可能还有其他几种类型),每个 id 的每个关系可以有多个 table_b.name。

这是一项太复杂的任务吗?

【问题讨论】:

  • 请注意:'id' 是 table_b 不应该这样命名,而是应该使用类似 table_a_id 的东西来提高可读性
  • 您可以在选择查询中使用 case 语句来实现这一点。
  • @Naveen:您不需要重命名该列,因为表名/别名会清楚地表明:table_b.id 等。
  • @davek 这里的 table_b.id 不是指 table_b 的主键。请检查。但它是table_a的外键
  • @Naveen:你说的很对——我看错了!

标签: mysql sql join concatenation


【解决方案1】:
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

SQLFiddle Demo

以后,如果您有除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;

SQLFiddle Demo

【讨论】:

  • +1 漂亮整洁。只是想知道:group_concat 中存在一个 NULL 是否会将整个字符串减少为 NULL?
  • @JoachimIsaksson 你是对的,这是一个诚实的错误,我在 sqlfiddle 上运行后发现,
  • @davek nope,当使用aggregate function 时,它会丢弃空值。
  • 哪里有a.ID,是table_a.ID吗?如果在 FROM 和 INNER JOIN 上是这样,则您有 table_a a 和 table_b b。我不确定它是如何工作的,因为没有称为 a 或 b 的表或标题。
猜你喜欢
  • 2016-10-08
  • 1970-01-01
  • 2012-11-13
  • 2018-12-25
  • 1970-01-01
  • 2014-11-08
  • 2012-06-04
  • 2012-10-07
  • 2018-11-10
相关资源
最近更新 更多