📜  mysql join table with a text columns with ids split by char - SQL (1)

📅  最后修改于: 2023-12-03 14:44:27.093000             🧑  作者: Mango

MySQL连接包含由字符分隔的标识符文本列的表 - SQL

在MySQL中,有时您需要将两个表连接在一起,其中包含具有由字符分隔的标识符的文本列。这可以通过使用MySQL内置的字符串函数和表连接操作来实现。

示例

假设你有两个表:

users

| id | name | | --- | ------ | | 1 | Alice | | 2 | Bob | | 3 | Carol | | 4 | Dave |

orders

| id | item_ids | | --- | ------------- | | 1 | 1,2 | | 2 | 3,4 | | 3 | 1,3,4 | | 4 | 2,3,4 |

在这个例子中,用户(users)表包含用户的id和名字,而订单(orders)表包含订单的id和与订单相关联的商品id的逗号分隔列表。

为了获取每个订单的商品名称,我们需要将订单表与用户表和商品表连接起来,然后解析商品ID列表以获取商品名称。

以下是如何实现此操作的SQL查询:

SELECT
  orders.id AS order_id,
  users.name AS user_name,
  GROUP_CONCAT(products.name) AS product_names
FROM
  orders
  INNER JOIN users ON FIND_IN_SET(users.id, orders.user_ids) > 0
  INNER JOIN products ON FIND_IN_SET(products.id, orders.item_ids) > 0
GROUP BY
  orders.id, users.name

上述查询将返回一个结果集,其中包括每个订单的ID,用户名和商品名称列表。

解释

让我们逐步分解上面的SQL查询:

SELECT
  orders.id AS order_id,
  users.name AS user_name,
  GROUP_CONCAT(products.name) AS product_names

这是我们要检索的字段列表。我们选择将订单ID指定为“order_id”,用户名指定为“user_name”,而商品名称列表则将使用MySQL的“GROUP_CONCAT”函数进行聚合。

FROM
  orders
  INNER JOIN users ON FIND_IN_SET(users.id, orders.user_ids) > 0
  INNER JOIN products ON FIND_IN_SET(products.id, orders.item_ids) > 0

这是我们从中检索数据的表/视图列表。我们要连接三个表:订单,用户和产品。我们使用“INNER JOIN”语法将这些表连接在一起。我们使用MySQL的“FIND_IN_SET”函数来检查每个订单和产品中包含的用户ID和商品ID列表。如果在列表中找到了匹配项,则返回1,否则返回0。

GROUP BY
  orders.id, users.name

最后,我们使用“GROUP BY”语法来聚合结果集。我们按订单ID和用户名进行分组,以便商品名称列表正确计算。

结果

返回的结果将类似于以下的格式:

| order_id | user_name | product_names | | -------- | --------- | ------------- | | 1 | Alice | Widget, Gizmo | | 2 | Carol | Doodad, Fizz | | 3 | Alice | Widget, Doodad, Fizz | | 4 | Bob | Gizmo, Doodad, Fizz |

在每个订单中,商品名称使用逗号分隔列表显示。这些商品名称按照订单ID和用户名排序,并由逗号分隔。