1

我有一个棘手的问题,我想看看是否有更简单的方法来解决它。

我说

$numbers= $_GET['numbers']; //resulting in $numbers=array(1,2,3)
  • 数组中的计数可能会因 $_GET 值而异...
  • 这些需要使用'%" . $number. "%'进行搜索,因为行中可能有多个以逗号分隔的数字

我的理想结果是搜索 $numbers(1,2,3) :

SELECT * FROM database WHERE numbers LIKE('%1%' OR '%2%' OR '%2%')
4

6 回答 6

2

这段代码:

<?php
$numbers = array(1,2,3);
$sql = "SELECT * FROM table WHERE numbers LIKE ('%" . implode("%' OR '%", $numbers) . "%')";

产生这个查询:

SELECT * FROM table WHERE numbers LIKE ('%1%' OR '%2%' OR '%3%')
于 2012-05-21T04:28:20.620 回答
2

无需OR为数组的每个元素注入许多运算符。相反,您可以使用rlike(MySQL 的正则表达式匹配器运算符)并在很大程度上简化您的代码,如下所示:

$numbers = array(1,2,3);
$sql = 'SELECT * from `database` WHERE number rlike "^'.implode('|', $numbers).'$"';
// $sql becomes: SELECT * from `database` WHERE number rlike "^1|2|3$"
于 2012-05-21T04:22:26.093 回答
2
$like_part = implode(' OR ', array_map(function($i) {
        return "(_utf8 '%{$i}%' USING latin1)";
    }, $numbers)
);
于 2012-05-21T03:33:14.240 回答
2

使用 foreach 构建 where 字符串,然后将其添加到查询中。

$query = '...';

$where = '';
foreach ($numbers as $number) {
    $where .= ...
}

$query .= $where;

我不会提到您应该规范化您的表并使用准备好的查询。

于 2012-05-21T03:34:07.590 回答
1

大意为:

$query = "select * from tablewhere condition like ('text before '".implode("' text after text before'", $array)." ' text after')"

$query = "select * from tablewhere numbers like (\"_utf8 '%" . implode("%' using latin1\", $_GET['numbers']) . "%' using latin1 OR _utf8 '%\")

[不确定内爆是否是针/干草堆,反之亦然]

于 2012-05-21T03:32:09.687 回答
0
1 - SELECT * FROM b AS B INNER JOIN a AS A ON A.a=B.a WHERE A.a RLIKE '^1-|^2-|^3'
2 - SELECT * FROM b AS B INNER JOIN a AS A ON A.a=B.a WHERE (A.a LIKE '1-%' OR A.a LIKE '2-%' OR A.a LIKE '3-%')

第一个查询出现了

  1. 内存使用=需要时间
  2. 执行时间 = 需要时间
  3. PHPMYADMIN 显示第 0 - 24 行(总共 138 行,查询耗时 1.1243 秒。) - 使用比直接 PHP 脚本更少的数据进行测试

第二个查询出现了

  1. 内存使用量 = 1198.0807113647 MB
  2. 执行时间 = 30.719851970673 秒
  3. PHPMYADMIN - 显示第 0 - 24 行(总共 138 行,查询耗时 0.0018 秒。) - 使用比直接 PHP 脚本更少的数据进行测试

Foreach 到处走走

  1. 内存使用 = 972.3137588501 MB
  2. 执行时间 = 10.898797988892 秒

配置

  1. 32GB 内存
  2. Intel I9 - 第 10 代 CPU@2.81GHz
  3. PHP 7.3
  4. MYSQL - 5.7.31
  5. 表大小 - SQL 过程生成的 200 万条数据
  6. 显示变量,例如“have_query_cache”;// 是的
  7. 获取的数据大小 275093
  8. 索引 - 可用
  9. LIKE 运算符 4739 中的变量计数(i.e. 1,2,3... in RLIKE '^1-|^2-|^3....etc')
  10. php函数计算的内存使用量memory_get_usage();

欢迎提出异议。

于 2021-07-18T13:26:46.853 回答