首页  >  文章  >  数据库  >  MySQL 中可以根据分号分隔的值连接表吗?

MySQL 中可以根据分号分隔的值连接表吗?

Barbara Streisand
Barbara Streisand原创
2024-11-01 00:03:28939浏览

Can I Join Tables in MySQL Based on Values Separated by Semicolons?

我可以用纯 MySQL 解决这个问题吗? (加入列中的“;”分隔值)

问题:

我在多个表中有数据,需要根据“;”加入(分号)列中的分隔值。我无法使用 PHP 或任何其他语言来操纵结果。有没有办法仅使用 MySQL 来实现此目的?

答案:

是的,可以通过 ';' 加入使用纯 MySQL 在列中分隔值。下面是解决方案的详细说明:

将分隔字符串转换为行

关键是转换 ';'将分隔字符串分成一系列行。这可以通过以下步骤来实现:

  1. 创建一个名为 integerseries 的表,其中包含从 1 到分隔字符串中最大项目数的数字。
  2. 使用 COUNT_IN_SET 和 VALUE_IN_SET函数计算分隔字符串中的项目数并根据其位置提取每个项目。
  3. Join user_resource 表与使用交叉连接的integerseries 表。这将为分隔字符串中的每个项目生成行。

规范化 User_resource 表的查询

<code class="sql">SELECT user_resource.user, 
       user_resource.resources,
       COUNT_IN_SET(user_resource.resources, ';') AS resources_count, 
       isequence.id AS resources_index,
       VALUE_IN_SET(user_resource.resources, ';', isequence.id) AS resources_value
FROM 
     user_resource 
     JOIN  integerseries AS isequence 
       ON  isequence.id <= COUNT_IN_SET(user_resource.resources, ';')
ORDER BY
       user_resource.user, isequence.id</code>

将规范化表与资源表

一旦 user_resource 表标准化后,可以与资源表连接以获得所需的结果。

<code class="sql">SELECT user_resource.user, 
       resource.data

FROM user_resource 
     JOIN integerseries AS isequence 
       ON isequence.id <= COUNT_IN_SET(user_resource.resources, ';')

     JOIN resource 
       ON resource.id = VALUE_IN_SET(user_resource.resources, ';', isequence.id)      
ORDER BY
       user_resource.user,  resource.data</code>

示例输入和输出

user_resource 表:

user resources
user1 1;2;4
user2 2
user3 3;4

资源表:

id data
1 data1
2 data2
3 data3
4 data4
5 data5

标准化用户资源表:

user resources resources_count resources_index resources_value
user1 1;2;4 3 1 1
user1 1;2;4 3 2 2
user1 1;2;4 3 3 4
user2 2 1 1 2
user3 3;4 2 1 3
user3 3;4 2 2 4

输出(连接结果):

user data
user1 data1
user1 data2
user1 data4
user2 data2

以上是MySQL 中可以根据分号分隔的值连接表吗?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn