【问题标题】:MYSQL CONCAT + GROUP_CONCAT + LEFT OUTER JOINMYSQL CONCAT + GROUP_CONCAT + 左外连接
【发布时间】:2018-09-04 11:57:20
【问题描述】:

我正在尝试在 mySQL 上的 2 个表之间建立链接,但是我认为这比我想象的要难一些。

我有 3 张桌子 * 一个注册我的规则信息 * 一个注册我的转账信息的 * 一个首先在两者之间建立支点。

CREATE TABLE `rules` (
  `id` int,
  `Name` varchar(10)
);

INSERT INTO `rules` (`id`, `name`) VALUES
(1,'a'),
(2,'b'),
(3,'c'),
(4,'d');

CREATE TABLE `pivot` (
  `id_rule` int,
  `id_transfert` int
);

INSERT INTO `pivot` (`id_rule`, `id_transfert`) VALUES
(1,1),
(1,2),
(2,1),
(2,2),
(2,3);

CREATE TABLE `transferts` (
  `id` int,
  `aeroport` varchar(50),
  `station` varchar(50)
);

INSERT INTO `transferts` (`id`, `aeroport`,`station`) VALUES
(1,'GVA','Flaine'),
(2,'GNB','La Tania'),
(3,'GNB','Flaine');

我想要做的是使用一个列来获取我的所有规则,该列将所有链接的传输收集为 JSON 字符串。如下所示

-------------------------------------------------- ---------------------- |编号 |姓名 |转让| -------------------------------------------------- ---------------------- | 1 |一个 | {“GVA”:“弗莱恩”} | -------------------------------------------------- ---------------------- | 2 |乙 | {“GVA”:“Flaine”,“GNB”:“Flaine”,“La Tania”} | -------------------------------------------------- ----------------------

我实际上是这样做的:

选择 rule.id, rule.name,GROUP_CONCAT(stations.transferts SEPARATOR ",") as transferts 从 规则规则 左外连接 枢轴枢轴 在 (pivot.id_rule = rule.id) 左外连接 ( 选择身份证, CONCAT(机场,“:”, GROUP_CONCAT(站) ) 作为转移 FROM 转账 按机场分组 ) 车站 在 (pivot.id_transfert = station.id) 通过...分组 规则.id

但这给我返回了一个“空”值。我不明白我做错了什么。 请问有人可以帮助我吗?

仅供参考,我受到此链接的启发 MySQL: GROUP_CONCAT with LEFT JOIN

【问题讨论】:

  • 据我所见,您预期的 JSON 无效。您不能有一个指向 CSV 字符串列表的键。
  • 您使用的是哪个版本的 MySQL? 5.7 包括 JSON 支持,5.7.22 支持聚合 JSON 函数,这在这里可能会有所帮助
  • 感谢您的回答。我的 mySQL 版本是 5.6.39。你能给我一个聚合 JSON 的例子吗?

标签: mysql concat group-concat


【解决方案1】:

对于 5.7.22 之前的 MySQL 版本,您不能使用 JSON 内置函数。

您必须使用一些重叠的 GROUP_CONCAT 子查询来获取您的 JSON 字符串。

如 cmets 所述,您预期的 JSON 字符串无效。以下答案将与您的预期结果不同,以解决此问题。

我建议您继续进行第一次查询,以获取包含“aeroport”名称的列,以及另一列包含格式化为列表的关联站点,用于每对“rule.id + aeroport_name”。

这给出了以下查询:

mysql> select rules.id, name, concat ('"', aeroport, '":') as aeroport_name, group_concat('"', station, '"') as station_list
    -> from rules
    -> inner join pivot on rules.id = pivot.id_rule
    -> inner join transferts on pivot.id_transfert = transferts.id
    -> group by rules.id, aeroport_name;
+------+------+---------------+---------------------+
| id   | name | aeroport_name | station_list        |
+------+------+---------------+---------------------+
|    1 | a    | "GNB":        | "La Tania"          |
|    1 | a    | "GVA":        | "Flaine"            |
|    2 | b    | "GNB":        | "La Tania","Flaine" |
|    2 | b    | "GVA":        | "Flaine"            |
+------+------+---------------+---------------------+
4 rows in set (0,00 sec)

然后,我们将使用此查询作为子查询,以在单个字符串中的规则 id 上下文中将每个“station_list”关联到其给定的机场。

这给出了以下封装:

mysql> select id, name, group_concat(aeroport_name, '[', station_list, ']') as aeroport_list
    -> from (
    ->    select rules.id, name, concat ('"', aeroport, '":') as aeroport_name, group_concat('"', station, '"') as station_list
    ->    from rules
    ->    inner join pivot on rules.id = pivot.id_rule
    ->    inner join transferts on pivot.id_transfert = transferts.id
    ->    group by rules.id, aeroport_name
    -> ) as isolated group by id;
+------+------+----------------------------------------------+
| id   | name | aeroport_list                                |
+------+------+----------------------------------------------+
|    1 | a    | "GNB":["La Tania"],"GVA":["Flaine"]          |
|    2 | b    | "GNB":["La Tania","Flaine"],"GVA":["Flaine"] |
+------+------+----------------------------------------------+
2 rows in set (0,00 sec)

最后,我们现在可以将最终的“{}”封装添加到我们的字符串中,为此添加一个顶级查询:

mysql> select id, name, concat('{', aeroport_list, '}') as conf                                                                                                                                                                                   
    -> from (
    ->    select id, name, group_concat(aeroport_name, '[', station_list, ']') as aeroport_list
    ->    from (
    ->       select rules.id, name, concat ('"', aeroport, '":') as aeroport_name, group_concat('"', station, '"') as station_list
    ->       from rules
    ->       inner join pivot on rules.id = pivot.id_rule
    ->       inner join transferts on pivot.id_transfert = transferts.id
    ->       group by rules.id, aeroport_name
    ->    ) as isolated group by id
    -> ) as full_list;
+------+------+------------------------------------------------+
| id   | name | conf                                           |
+------+------+------------------------------------------------+
|    1 | a    | {"GNB":["La Tania"],"GVA":["Flaine"]}          |
|    2 | b    | {"GNB":["Flaine","La Tania"],"GVA":["Flaine"]} |
+------+------+------------------------------------------------+
2 rows in set (0,01 sec)

【讨论】:

  • 非常感谢,你太棒了。我仍在尝试了解您所做的事情,因为我到目前为止还没有达到这个结果。你真是个好老师。谢谢
猜你喜欢
  • 2013-08-25
  • 2012-07-28
  • 1970-01-01
  • 2011-11-23
  • 2017-12-07
  • 2015-12-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多