Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/280.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
Php 使用长“where in”条件的查询或许多小查询有什么更好的方法?_Php_Mysql_Codeigniter - Fatal编程技术网

Php 使用长“where in”条件的查询或许多小查询有什么更好的方法?

Php 使用长“where in”条件的查询或许多小查询有什么更好的方法?,php,mysql,codeigniter,Php,Mysql,Codeigniter,也许这有点愚蠢,但我只是不确定什么更好。 如果我必须检查数据库中超过10k行的存在性,我会怎么做 1-一个查询 select id from table1 where name in (smth1,smth2...{till 30k}) 2-许多查询 select id from table1 where name=smth1 虽然,性能不是目标,但我也不想因为mysql而失败; 也许,任何其他解决方案都更适合。。。 谢谢 upd:任务是获取域列表,保存尚未在db中的新域,并删除列表中出现的

也许这有点愚蠢,但我只是不确定什么更好。 如果我必须检查数据库中超过10k行的存在性,我会怎么做

1-一个查询

select id from table1 where name in (smth1,smth2...{till 30k})
2-许多查询

select id from table1 where name=smth1
虽然,性能不是目标,但我也不想因为mysql而失败; 也许,任何其他解决方案都更适合。。。 谢谢


upd:任务是获取域列表,保存尚未在db中的新域,并删除列表中出现的域。希望,这会对您有所帮助…

您应该做的是创建一个临时表,插入所有名称,并对该表使用一个查询联接进行选择

select id 
from table1 t1
inner join temptable tt on t1.name = tt.name

单个查询很可能会执行得更好,因为第二个查询会带来很多往返延迟。但是,如果您有很多像示例中那样的名称,那么第一个方法可能会导致您达到内部限制


在这种情况下,最好将名称列表存储在一个临时表中并与之联接。

根据您将来需要执行类似操作,您可能希望在数据库“strlist_to_table”中添加一个函数。让函数获取一个文本,其中您的输入由分隔符字符分隔(可能也传递给函数),在分隔符上拆分它以创建一个动态表。然后你可以用

where in strlist_to_table('smth1|smth2', '|')
而且还可以从sql注入中获得保护,可能输入中会出现一些小Bobby表


我不确定你的应用程序设计有多灵活,但可能值得研究一下,完全删除带分隔符的列表,只需创建一个永久的第三个表来表示多对多关系,然后在每个查询上加入表。

你确定不能用其他方法吗?@Lo'oris:我认为他的意思是他可以用另一种方法,当他写“也许”时,任何其他的解决方案都会更适合你的意思是,首先创建临时表诱惑名varchar255;然后在其中插入许多行,并像您的示例中那样连接它?@DCrystal:是的,完全正确。名字列表来自哪里?名字列表来自php脚本-它从某个url获取列表。。。但我不知道你为什么问这个问题?@DCrystal-因为如果它来自数据库,可能会有不同的方法。