使用OR和LIKE%查询PHP foreach?

时间:2012-05-21 03:25:57

标签: php mysql arrays sql-like

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

我已经说过了

$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%')

6 个答案:

答案 0 :(得分:2)

$like_part = implode(' OR ', array_map(function($i) {
        return "(_utf8 '%{$i}%' USING latin1)";
    }, $numbers)
);

答案 1 :(得分:1)

效果:

$ query =“select * from table where condition like('text before'”.implode(“'text after text before'”,$ array)。“'text after')”

$ query =“select * from table其中数字如(\”_ utf8'%“。implode(”%'使用latin1 \“,$ _GET ['numbers'])。”%'使用latin1或_utf8'%\“)

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

答案 2 :(得分:1)

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

$query = '...';

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

$query .= $where;

我不会提到你应该normalize your tables并使用准备好的查询。

答案 3 :(得分:1)

无需为Array的每个元素注入许多OR个运算符。相反,您可以使用rlike (the regex matcher operator of 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$"

答案 4 :(得分:1)

此代码:

<?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%')

答案 5 :(得分: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. 英特尔 I9 - 第 10 代 CPU@2.81GHz
  3. PHP 7.3
  4. MYSQL - 5.7.31
  5. 表大小 - SQL 过程生成的 200 万条数据
  6. SHOW VARIABLES LIKE '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();计算的内存使用率

欢迎提出异议。