【问题标题】:generate index/position of string from a csv string in mysql从mysql中的csv字符串生成字符串的索引/位置
【发布时间】:2021-07-20 11:10:03
【问题描述】:

我需要在 MySQL 中生成一些东西

"Java, MySQL, Python"

"1,2,3"

我的想法是我在 csv 字符串中有 3 个字符串,我需要一个从 1 到 n (3) 的整数序列。

csv字符串是由mysql的GROUP_CONCAT()函数生成的。

提前致谢。

【问题讨论】:

  • 简单1,2,3?或者这些值是从另一个表中获取的单独字符串值的索引/标识符?

标签: mysql csv group-concat


【解决方案1】:
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' 是两个不同的值)。

【讨论】:

  • 实际上你的ref 表应该是我的输出,具体取决于main 表。在您的回答中,您对 ref 表进行了硬编码,这在我的情况下是不可能的。实际上我想生成每个字符串的位置/索引。如果输入字符串是Java, MySQL,那么输出应该是1,2。我希望我能说清楚。谢谢
  • 您要根据main 表数据创建和填充 ref 表吗?或者您只需要生成包含相邻整数的新值? Anycase提供精确 MySQL版本。
  • 任何人都可以接受我的情况。 MySQL 5.7.30
  • @sarwar026 每个 CSV 的单独值的数量是否有上限?或者 - 存储过程,而不是单个查询,对您安全吗?
  • 我实际上是在存储过程中执行此操作的。上限不会那么多...如果您有解决方案,请分享。提前致谢。
猜你喜欢
  • 1970-01-01
  • 2014-11-06
  • 2015-11-17
  • 1970-01-01
  • 2016-02-22
  • 2012-06-24
  • 1970-01-01
  • 2011-09-23
  • 2020-12-01
相关资源
最近更新 更多