在一个字段中分隔的外键

u0sqgete  于 2021-06-23  发布在  Mysql
关注(0)|答案(1)|浏览(203)

我有两张table:
t分配

ID      |      Name      |  Type
1       | Location1      |  {"0":"23","1":"27","2":"24","3":"22"}
2       | Location2      |  {"0":"22","1":"25"}

tbllocationtypes类型

ID      |      title      
22      |    Wines
23      |    Milk
24      |    Cereals
25      |    Drinks
26      |    Beef
27      |    Chicken

Type 字段(使用这种精确格式)类型的外键是专门分隔的 "0":"Default Foreign Key of tbllocationtype", "1","First additional Foreign Key of tbllocationtype", "2","Second Additional Foreign Key of tbllocaitontype" 我需要一个包含所有位置的列表,其中包含如下所有类型的字段:
查询结果:

IDLocation     |   Name       |     Types
1                Location1       Milk,Chicken,Cereals,Wine
2                Location2       Wines,Drinks

你能帮帮我吗?我对mysql太差了,没法找到答案。
谢谢

ee7vknir

ee7vknir1#

在mysql的现代版本(>=8.0.4)中,查询相对简单:

SELECT
  `l`.`id` `IDLocation`,
  `l`.`name` `Name`,
  GROUP_CONCAT(`lt`.`title`) `Types`
FROM
  `tbllocations` `l`,
  JSON_TABLE(`l`.`type`,
    '$.*' COLUMNS(
      `id` BIGINT UNSIGNED PATH '$'
    )
  ) `der`
  INNER JOIN `tbllocationtypes` `lt` ON
    `lt`.`id` = `der`.`id`
GROUP BY
  `l`.`id`,
  `l`.`name`;

见db小提琴。
但是,在旧版本中,并不是那么简单,只有一个选择:

SELECT
  `l`.`id` `IDLocation`,
  `l`.`name` `Name`,
  GROUP_CONCAT(`lt`.`title`) `Types`
FROM
  `tbllocationtypes` `lt`
  LEFT JOIN
    `tbllocations` `l` ON
      JSON_CONTAINS(
        JSON_EXTRACT(`l`.`type`, '$.*'),
        JSON_QUOTE(CAST(`lt`.`id` AS CHAR))
      )
WHERE
  `l`.`id` IS NOT NULL
GROUP BY
  `l`.`id`,
  `l`.`name`;

见db小提琴。
在任何情况下,请记住5.1.7服务器系统变量::group\u concat\u max\u len。

相关问题