问题:
我在多个表中有数据,需要根据“;”加入(分号)列中的分隔值。我无法使用 PHP 或任何其他语言来操纵结果。有没有办法仅使用 MySQL 来实现此目的?
答案:
是的,可以通过 ';' 加入使用纯 MySQL 在列中分隔值。下面是解决方案的详细说明:
将分隔字符串转换为行
关键是转换 ';'将分隔字符串分成一系列行。这可以通过以下步骤来实现:
规范化 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中文网其他相关文章!