CREATE TABLE main SELECT "Java,MySQL,Python" txt, NULL idx;
CREATE TABLE ref SELECT 1 id, 'Java' val UNION SELECT 2, 'MySQL' UNION SELECT 3, 'Python';
SELECT main.txt, GROUP_CONCAT(ref.id)
FROM main
JOIN ref ON FIND_IN_SET(ref.val, main.txt)
GROUP BY main.txt
| txt |
GROUP_CONCAT(ref.id) |
| Java,MySQL,Python |
1,2,3 |
db小提琴here
更新
CREATE TABLE main (txt TEXT, idx TEXT);
INSERT INTO main (txt) VALUES
('Java,MySQL,Python'),
('C++,Python,MySQL,PostgreSQL');
SELECT * FROM main;
| txt |
idx |
| Java,MySQL,Python |
null |
| C++,Python,MySQL,PostgreSQL |
null |
CREATE TABLE ref (id INT AUTO_INCREMENT PRIMARY KEY, val VARCHAR(255));
INSERT INTO ref (val)
SELECT DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(txt, ',', num), ',', -1)
FROM main
CROSS JOIN ( SELECT 1 num UNION SELECT 2 UNION
SELECT 3 UNION SELECT 4 UNION SELECT 5) nums;
UPDATE main
JOIN ( SELECT main.txt,
GROUP_CONCAT(ref.id ORDER BY FIND_IN_SET(ref.val, main.txt)) idx
FROM main
JOIN ref ON FIND_IN_SET(ref.val, main.txt)
GROUP BY main.txt ) data USING (txt)
SET main.idx = data.idx;
SELECT * FROM ref;
SELECT * FROM main;
| id |
val |
| 1 |
C++ |
| 2 |
Java |
| 3 |
Python |
| 4 |
MySQL |
| 5 |
PostgreSQL |
| txt |
idx |
| Java,MySQL,Python |
2,4,3 |
| C++,Python,MySQL,PostgreSQL |
1,3,4,5 |
db小提琴here
如果需要,您可以更改 GROUP_CONCAT() 中的 ORDER BY 子句。
子查询num 必须生成从 1 到不小于 CSV 中单独值数量的数字的相邻整数。或者,您可以使用带有此类列表的一些服务表(专门创建,或使用,例如,mysql.help_keyword)。
两个查询都可以放在一个存储过程中。
注意 - 逗号和 CSV 值之间有 NO 空格字符。如果存在,则此空间将被视为值的一部分('MySQL' 和 ' MySQL' 是两个不同的值)。