我有以下示例表和属性:
---------------------------
| 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在一个查询中将字符串拆分为单独的条件(即POOLE
和WALLASEY
),以便查询检索所有行?
答案 0 :(得分:3)
SELECT * FROM `table` WHERE `town` REGEXP 'POOLE|WALLASEY';
这将匹配具有一个或多个POOLE或WALLASEY实例的任何行。
对于PHP方面,根据您在数据集中有多少种分隔符(在这种情况下为“/”),它可能会相当快速地变得混乱。 但用'|'替换'/'在getPlayerTown()中似乎是一种方法。
至于性能,我不确定REGEXP是如何与LIKE相对的。
答案 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透视表。