Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.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 使用带逗号分隔ID的字符串的SQL select命令_Php_Mysql_Sql_Select_Wildcard - Fatal编程技术网

Php 使用带逗号分隔ID的字符串的SQL select命令

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),它应该只提供第一个作为结果,而

我在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),它应该只提供第一个作为结果,而不是另一个

因此,我将得到所有匹配行的合并结果

我怎样才能做到这一点


谢谢大家!

如果该字符串来自数据库中的某个列,则应修复该架构。设计一个必须处理子列数据的模式几乎总是一个坏主意

如果它是数据库外部的字符串,并且您只想基于各个部分运行查询,那么最好使用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'