Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.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,我在数据库中有一列,代表如下所示的语言: userId languages 1 de,fr,en 2 de,fr 3 de 我想根据多种语言过滤结果,因此,例如,我需要说de和fr(两者)的用户 我试图使用FIND_IN_SET,但第一个参数只接受一种语言 我想提到的是,表是第三方的,过滤器参数是动态的。该示例只是一些模拟数据,解释原理,然后使用AND在where中进行两个测试 SELECT id from <table> WH

我在数据库中有一列,代表如下所示的语言:

userId    languages
1         de,fr,en
2         de,fr
3         de
我想根据多种语言过滤结果,因此,例如,我需要说de和fr(两者)的用户

我试图使用FIND_IN_SET,但第一个参数只接受一种语言


我想提到的是,表是第三方的,过滤器参数是动态的。该示例只是一些模拟数据,解释原理,然后使用AND在where中进行两个测试

SELECT id from <table>
WHERE find_in_set('fr', languages) > 0
  AND find_in_set('de', languages) > 0
从中选择id
其中查找集合中的集合('fr',语言)>0
并在_集合('de',语言)>0中查找_

问题的直接答案:

SELECT userId FROM users WHERE find_in_set('de',languages) AND find_in_set('fr', languages)
建议:
但您应该尝试遵循规范化来正确维护数据库。请先阅读1NF,然后检查标准化的整个概念。

现在你知道为什么在单个单元格中放置逗号分隔列表不是重复的吗?你有一个查询例子,你已经尝试了其他几个人所说的代码,你应该考虑规范化。MySQL和大多数其他结构化数据库引擎在通过索引过滤数据方面非常高效-您的
FIND_IN_SET
函数会使该数据列上的任何索引都不可用。您要求数据库引擎在每次查询时分别检查数据库表中的每一行,并要求它执行非常昂贵的操作(几个CSV查找)。如果您对数据库进行规范化,您可以应用一些索引并在
~O(logn)
中执行
中的
WHERE
,而不是
~O
工作。当(假设您有足够的记录)查找花费非常长的时间时,您就会知道在这里不进行规范化的代价是什么。对查询运行
EXPLAIN SELECT…
,您将看到它需要检查多少行(每一行,您的操作方式)以及使用了多少索引(无)。+1表示正常化。使用当前的表设计,您最终会遇到任何规模的严重性能问题。SQL(暗指MySQL)是建立在规范化原则基础上的,一旦你理解了它,它就非常棒!保持好奇心,继续学习我的朋友!这在本例中效果很好,但过滤器是动态的。理想情况下,这将是完美的解决方案,但我所依赖的表是第三方的:D我只需要知道如何选择,而不是正确的设计,如果是一些模拟测试,你不考虑性能,我有一个问题。您是直接在SQLShell中运行它,还是通过另一种编程语言使用它?如果是通过编程语言,您可以编写一个小函数,为每个查询的语言添加find_in_set部分