栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

MySQL“ IN”子句中的逗号分隔值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySQL“ IN”子句中的逗号分隔值

以@Jeremy Smith的FIND_IN_SET()示例为基础,您可以使用联接来完成此操作,因此不必运行子查询。

SELECt * FROM table tJOIN locations l ON FIND_IN_SET(t.e_ID, l.city) > 0WHERe l.e_ID = ?

这是众所周知的非常表现不佳,因为它做表扫描,评估FIND_IN_SET()函数 每一
行的组合

table
locations
。它不能利用索引,也没有办法对其进行改进。

我知道您说过您正在尽最大努力利用糟糕的数据库设计,但是您必须了解这有多么严重。

说明:假设我要您查找电话簿中名字开头,中间或最后一个字母为“ J”的所有人。在这种情况下,书的排序顺序是无济于事的,因为无论如何您都必须扫描每一页。

LIKE
@fthiella提供的解决方案在性能方面也存在类似问题。无法索引。

另请参阅我对在数据库列中存储分隔列表的问题真的那么糟糕吗?对于这种存储非规范化数据的方式的其他陷阱。

如果可以创建补充表来存储索引,则可以将位置映射到城市列表中的每个条目:

CREATE TABLE location2city ( location INT, city INT, PRIMARY KEY (location, city));

假设您有一个针对所有可能城市的查找表(而不仅仅是提到的城市

table
),那么您可以忍受效率低下的一次生成映射的麻烦:

INSERT INTO location2city (location, city)  SELECt l.e_ID, c.e_ID FROM cities c JOIN locations l  ON FIND_IN_SET(c.e_ID, l.city) > 0;

现在,您可以运行效率更高的查询来查找您的条目

table

SELECt * FROM location2city lJOIN table t ON t.e_ID = l.cityWHERe l.e_ID = ?;

这可以利用索引。现在,您只需要注意行中的任何INSERT / UPDATE /
DELETE行

locations
也会在中插入相应的映射行
location2city



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/416360.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号