【问题标题】:SQL select command using string with comma separated IDs使用带有逗号分隔 ID 的字符串的 SQL 选择命令
【发布时间】:2014-10-26 07:51:24
【问题描述】:

我在 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 具有 (31234,5678956781234) 它应该只提供第一个结果而不提供另一个结果。

因此我会得到所有匹配行的合并结果。

我怎样才能做到这一点?

谢谢!

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 如果您曾经发现自己必须处理子列数据(提取列的一部分),那么您做错了 :-) 修复架构和查询会尖叫。
  • @paxdiablo:这不是分列数据...这是他想搜索的 ID 列表
  • 这串数字是从哪里来的?
  • 它将以 php 变量的形式出现,比如 $ids

标签: php mysql sql select wildcard


【解决方案1】:

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

如果它是来自数据库外部的字符串,并且您只想根据各个部分运行查询,那么最好使用 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(根据您的问题编辑),您可以使用 explode 函数来拆分字符串,例如:

$list = "1234,2345,4567,5676,234,12,78957";
$numbers = explode (",", $list);

然后对$numbers的每个元素执行一次查询。


如果您所追求的是由所有这些值形成的单个结果集,那么还有其他方法可以做到这一点。一种方法是使用该列表构造一个“超级查询”字符串,该字符串将为您完成所有工作,然后您执行一次。

只需使用or 子句将不同的“子”查询合并为一个(伪代码):

$query = "select * from table_num"
$joiner = " where"
for each $element in $list:
    $query = $query + $joiner + "id like '%" + $element + "'"
    $joiner = " or"
execute_sql $query

这最终会为您提供查询字符串:

SELECT * FROM TABLE_NUM
    WHERE ID LIKE '%1234'
    OR    ID LIKE '%2345'
    :
    OR    ID LIKE '%78957'

【讨论】:

  • 我想要所有这些没有被挑出来的合并结果。
  • 因为php查询结果会做进一步处理。我想一个合适的 SQL 存储过程会更有用。
  • 好的,@Gleon,我添加了一个构造 single 查询的方法,该查询将提取所有需要的行。我的 PHP 知识还没有达到我有信心提供无错误代码的水平,所以我只是给出了伪代码。
  • 这会放慢速度,因为我将在一个字符串中有 100 多个 ID。我在 SQL 中做这样的事情会更快。您是否也可以查看我关于限制“%”的相关编辑。
  • @Gleon,因为你使用%xxx 作为参数,它几乎肯定会很慢。一些 DBMS 可以通过使用反向索引来缓解这种情况。先担心功能,然后质疑性能。没有比“错误”更理想的了:-)
猜你喜欢
  • 2021-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-22
  • 1970-01-01
相关资源
最近更新 更多