Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
MySQL按逗号分隔的组列表唯一_Mysql - Fatal编程技术网

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