我有一张桌子:
ID name
1 john, peter, ken
如何使用 MYSQL 将名称列(值以逗号分隔)分隔成单独的列?
ID name
1 john
1 peter
1 ken
您可以使用这样的查询:
SELECT
id,
n.digit,
name,
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ',', n.digit+1), ',', -1)
FROM
mytable
INNER JOIN
(SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3) n
ON LENGTH(REPLACE(name, ',' , '')) <= LENGTH(name)-n.digit
(请注意,这最多只能分隔 4 个名称)。
小提琴在这里。
解释
我正在使用返回从 0 到 3 的所有数字的查询(例如,您可以使用具有 10 或 100 个数字的索引表):
SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3
然后,我使用此连接条件将这个号码与连接起来mytable
:
ON LENGTH(REPLACE(name, ',' , '')) <= LENGTH(name)-n.digit
这是检查名称列是否至少包含名称的“脏”方法n.digit
(我正在删除所有逗号,并且正在检查完整字符串的长度差异)。
使用 SUBSTRING_INDEX 您可以获得n.digit+1
逗号左侧的字符串部分:
SUBSTRING_INDEX(name, ',', n.digit+1)
并使用一个带有负参数的 SUBSTRING_INDEX ,您只能将字符串的一部分保留到第一个逗号:
SUBSTRING_INDEX(SUBSTRING_INDEX(name, ',', n.digit+1), ',', -1)
如果您需要将 thh 数据导入 mysql,那么您可以使用explode 创建一个 php 文件,为每个 id 创建一个数组。
这些可能会有所帮助: