📅  最后修改于: 2023-12-03 14:44:27.093000             🧑  作者: Mango
在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和用户名排序,并由逗号分隔。