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部分