MySQL按逗号分隔的组列表唯一
列文本字段具有逗号分隔的列表值MySQL按逗号分隔的组列表唯一,mysql,Mysql,列文本字段具有逗号分隔的列表值 ID | textfield 1 | english,russian,german 2 | german,french 3 | english 4 | null 我正在尝试计算textfield中的语言数量。默认语言为英语,因此如果为null,则为英语。正确的语言数量是英语、俄语、德语、法语 以下是我尝试执行此操作的查询: SELECT SUM((length(`textfield`) - length(replace(`textfie
ID | textfield
1 | english,russian,german
2 | german,french
3 | english
4 | null
我正在尝试计算textfield中的语言数量。默认语言为英语,因此如果为null,则为英语。正确的语言数量是英语、俄语、德语、法语
以下是我尝试执行此操作的查询:
SELECT SUM((length(`textfield`) - length(replace(`textfield`, ',', '')) + 1)) as my
FROM yourtable;
我得到的结果是6,我不知道如何对语言进行分组
这是小提琴
期望的结果是4。如何求解?对于5.6版,就像在小提琴中一样
SELECT COUNT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(languages.textfield, ',', numbers.num), ',', -1)) languages_count
FROM (SELECT COALESCE(textfield, 'english') textfield
FROM yourtable) languages
JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) numbers
ON numbers.num <= LENGTH(languages.textfield) - LENGTH(REPLACE(languages.textfield, ',', '')) + 1;
对于5.6版,就像在小提琴中一样
SELECT COUNT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(languages.textfield, ',', numbers.num), ',', -1)) languages_count
FROM (SELECT COALESCE(textfield, 'english') textfield
FROM yourtable) languages
JOIN (SELECT 1 num UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5) numbers
ON numbers.num <= LENGTH(languages.textfield) - LENGTH(REPLACE(languages.textfield, ',', '')) + 1;
识别错误源
您的查询所做的是计算每行中有多少种语言,并将它们全部相加。您的查询不考虑重复项。由于英语在表格中出现了两次,它被计算了两次,德语也被计算了两次,因此在你的例子中是第六次。另外,另一个问题是,您当前的代码将null视为null的真正含义,即缺少值。
例如,如果您的数据库是
ID | textfield
---|----------
1 | null
你也会得到错误的结果,更多关于这一点,见下文
解决方案
这将得到以逗号分隔的语言结果,没有重复
SELECT
GROUP_CONCAT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(textfield, ',', n.digit+1), ',', -1)) textfield
FROM
yourtable
INNER JOIN
(SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) n
ON LENGTH(REPLACE(textfield, ',', '')) <= LENGTH(textfield)-n.digit;
此查询可以作为您在问题提示中尝试执行的操作的参考。换句话说,不是长度“textfield”。。。您将提供此查询产生的列名
英语中为空
此逻辑不应在数据库级别IMHO上实现。如果你想继续将空项视为英语,那就好了。缺点是我之前为您提供的示例。当您有一个为数据库中的所有语言求解的查询时,如果英语不是一种明确声明的语言,而只是一个空值,那么该查询将不会“计算”英语,因为它是空的。但是你不能每次找到语言的数量就加1,因为英语可能已经很明确了
建议:
避免数据库中以逗号分隔的列表
识别错误源
您的查询所做的是计算每行中有多少种语言,并将它们全部相加。您的查询不考虑重复项。由于英语在表格中出现了两次,它被计算了两次,德语也被计算了两次,因此在你的例子中是第六次。另外,另一个问题是,您当前的代码将null视为null的真正含义,即缺少值。
例如,如果您的数据库是
ID | textfield
---|----------
1 | null
你也会得到错误的结果,更多关于这一点,见下文
解决方案
这将得到以逗号分隔的语言结果,没有重复
SELECT
GROUP_CONCAT(DISTINCT SUBSTRING_INDEX(SUBSTRING_INDEX(textfield, ',', n.digit+1), ',', -1)) textfield
FROM
yourtable
INNER JOIN
(SELECT 0 digit UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6) n
ON LENGTH(REPLACE(textfield, ',', '')) <= LENGTH(textfield)-n.digit;
此查询可以作为您在问题提示中尝试执行的操作的参考。换句话说,不是长度“textfield”。。。您将提供此查询产生的列名
英语中为空
此逻辑不应在数据库级别IMHO上实现。如果你想继续将空项视为英语,那就好了。缺点是我之前为您提供的示例。当您有一个为数据库中的所有语言求解的查询时,如果英语不是一种明确声明的语言,而只是一个空值,那么该查询将不会“计算”英语,因为它是空的。但是你不能每次找到语言的数量就加1,因为英语可能已经很明确了
建议:
避免数据库中以逗号分隔的列表
这是一个经典的例子,说明为什么答案是肯定的。您使用的是哪个版本的MySQL?@Nick使用的是MySQL版本8这是一个经典的例子,说明为什么答案是肯定的。您使用的是哪个版本的MySQL?@Nick使用的是MySQL版本8谢谢,你能解释一下查询的这一部分吗?选择0位联合全部选择1联合全部选择2联合全部选择3联合全部选择4联合全部选择5联合全部选择6?@user892134谢谢,你能解释一下查询的这一部分吗?选择0位联合全部选择1联合全部选择2联合全部选择3联合全部选择4联合全部选择5联合全部选择6?@user892134