MySQLi WHERE LIKE多个标准

时间:2015-05-28 18:05:18

标签: php mysqli

我有以下示例表和属性:

---------------------------
|  Name  |       Town     |
---------------------------
| Name 1 |      POOLE     |
| Name 2 | POOLE/WALLASEY |
| Name 3 | POOLE/WALLASEY |
| Name 4 |      POOLE     |
---------------------------

我在PHP中使用以下SQL语句来检索行:

SELECT * FROM `table` WHERE `Town` LIKE '%".$global->getPlayerTown()."%'

根据数据库返回的标准POOLE

---------------------------
|  Name  |       Town     |
---------------------------
| Name 1 |      POOLE     |
| Name 2 | POOLE/WALLASEY |
| Name 3 | POOLE/WALLASEY |
| Name 4 |      POOLE     |
---------------------------

但是,当使用条件POOLE/WALLASEY时,查询将返回:

---------------------------
|  Name  |       Town     |
---------------------------
| Name 2 | POOLE/WALLASEY |
| Name 3 | POOLE/WALLASEY |
---------------------------

如何智能地告诉PHP在一个查询中将字符串拆分为单独的条件(即POOLEWALLASEY),以便查询检索所有行?

4 个答案:

答案 0 :(得分:3)

SELECT * FROM `table` WHERE `town` REGEXP 'POOLE|WALLASEY';

这将匹配具有一个或多个POOLE或WALLASEY实例的任何行。

对于PHP方面,根据您在数据集中有多少种分隔符(在这种情况下为“/”),它可能会相当快速地变得混乱。 但用'|'替换'/'在getPlayerTown()中似乎是一种方法。

至于性能,我不确定REGEXP是如何与LIKE相对的。

https://dev.mysql.com/doc/refman/5.7/en/regexp.html

答案 1 :(得分:2)

这是一个经常被问到的问题类的迭代:如果我在一个字段中有一个以上的数据,如何选择单个数据?

答案一如既往:你没有。

原因有很多,但其中最重要的一个是性能:基本上LIKE '%...'不能使用索引。对于一些测试行,这可能没问题,但在缩放时很快就会出现问题。

唯一可靠的方法是

  • 标准化您的数据
  • 或使用全文索引

在你的情况下,我强烈投票支持规范化:创建一个towns表,然后通过连接表将其链接到玩家。您现在可以搜索任何完全索引使用的城镇,通过联接找到玩家。

答案 2 :(得分:1)

正如Marc B所说,使用explode

<?php
$array = explode("/",$global->getPlayerTown());

foreach($array as $Town){
  $list = $list ."'%" .$Town ."%', ";
}

$SQL = "SELECT * FROM `table` WHERE `Town` LIKE ANY(" .$list .")";
?>

请走智能路线并规范化您的数据。这个想法可能有效,但这并不意味着它是最好的选择。

答案 3 :(得分:0)

你可以爆炸城镇,然后循环遍历它们并像这样构建查询:

$towns = explode('/', $global->getPlayerTown());
$first = true;
$like_sql = '';
foreach($towns as $town) {
    $like_sql .= $first ? ' WHERE ' : ' OR ';
    $like_sql .= "`Town` LIKE '%{$town}%'";
    $first = false;
}
$query = "SELECT * FROM `table` {$like_sql}";

但是我建议你规范化你的数据,并有一个单独的城镇表,带有user_town透视表。