Php 使用带逗号分隔ID的字符串的SQL select命令
我在PHP中有一个字符串,如:Php 使用带逗号分隔ID的字符串的SQL select命令,php,mysql,sql,select,wildcard,Php,Mysql,Sql,Select,Wildcard,我在PHP中有一个字符串,如: "1234,2345,4567,5676,234,12,78957"..... 我想以varchar(30)格式提取这些数字,并在命令上使用它们,如 SELECT * FROM TABLE_NUM WHERE ID LIKE '%NUM'; 其中NUM将具有上述7个字符串 如果可能,我还希望将“%NUM”中的“%”限制为仅1-5个字符,即前缀不应大于5个字符。示例NUM=1234,ID为(3123456778956781234),它应该只提供第一个作为结果,而
"1234,2345,4567,5676,234,12,78957".....
我想以varchar(30)格式提取这些数字,并在命令上使用它们,如
SELECT * FROM TABLE_NUM WHERE ID LIKE '%NUM';
其中NUM将具有上述7个字符串
如果可能,我还希望将“%NUM”中的“%”限制为仅1-5个字符,即前缀不应大于5个字符。示例NUM=1234,ID为(3123456778956781234),它应该只提供第一个作为结果,而不是另一个
因此,我将得到所有匹配行的合并结果
我怎样才能做到这一点
谢谢大家! 如果该字符串来自数据库中的某个列,则应修复该架构。设计一个必须处理子列数据的模式几乎总是一个坏主意 如果它是数据库外部的字符串,并且您只想基于各个部分运行查询,那么最好使用DBMS外部的工具来构造查询 例如,在Linux下使用
bash
:
pax> list="1234,2345,4567,5676,234,12,78957"
pax> for i in $(echo $list | sed 's/,/ /g'); do
...> echo mysql "\"SELECT * FROM TABLE_NUM WHERE ID LIKE '%$i'\""
...> done
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%1234'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%2345'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%4567'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%5676'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%234'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%12'"
mysql "SELECT * FROM TABLE_NUM WHERE ID LIKE '%78957'"
该脚本将回显命令以执行您想要的操作(假设mysql
是DBMS的正确CLI接口)-只需在开始时删除echo
,即可实际执行命令
对于PHP(根据您的问题编辑),您可以使用函数拆分字符串,如:
$list = "1234,2345,4567,5676,234,12,78957";
$numbers = explode (",", $list);
然后对$numbers
的每个元素执行查询
如果您所追求的是由所有这些值组成的单个结果集,那么还有其他方法可以做到这一点。其中一个涉及使用列表构造一个“uber查询”字符串,该字符串将为您完成所有工作,然后执行一次 只需使用
或
子句将不同的“sub”查询连接成一个(伪代码):
这将为您提供查询字符串:
SELECT * FROM TABLE_NUM
WHERE ID LIKE '%1234'
OR ID LIKE '%2345'
:
OR ID LIKE '%78957'
您使用的是什么RDBMS?如果您发现自己必须处理子列数据(提取列的一部分),那么您就做错了:-)修复架构,您的查询就会发出尖叫声。@paxdiablo:这不是子列数据。。。这是一个他想搜索的ID列表,这个数字串从哪里来?它将以php变量的形式出现,比如$idsi,我希望所有这些的合并结果不会单独出现。因为php查询结果将被进一步处理。我想一个合适的SQL存储过程会更有用。好的,@Gleon,我添加了一个方法来构造一个查询,该查询将提取所有需要的行。我的PHP知识没有达到我有信心提供无bug代码的水平,所以我刚刚给出了伪代码。这会不会减慢速度,因为我将在一个字符串中包含100多个ID。我认为在SQL中这样做会更快。您还可以查看我对“%”的限制所做的编辑吗?@Gleon,因为您使用了
%xxx
作为参数,所以它几乎肯定会很慢。一些数据库管理系统可以通过使用反向索引来缓解这种情况。先担心功能,然后质疑性能。您不能得到比“错误”更差的优化结果:-)
SELECT * FROM TABLE_NUM
WHERE ID LIKE '%1234'
OR ID LIKE '%2345'
:
OR ID LIKE '%78957'