2012-07-02 53 views
1

列表当我运行我的代码,我不能找回,我瞄准,因为正在通过查询运行关键字不一样,在数据库的关键字的条目。寻找逗号隔开的关键字

关键词:

$keywords = 'spaghetti,macaroni,hamburger'; 

查询:

mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%$keywords%' ORDER BY id DESC LIMIT 1"); 

我针对使用这些关键字的条目:

food, restaurant, hamburger, spaghetti, taco,pie 

我可能失去了一些东西简单在这里,因为我一直连续工作12小时。但是,我已经尝试过解决此问题的任何尝试。

从我的观点来看,查询应该目标条目,因为有2名匹配的关键字来返回。

我应该做什么不同?

+5

这不是如何'LIKE'工作。您可能需要对数据进行规范化处理,以使关键字位于单独的表格中,并通过其ID为 –

+0

链接到餐厅(或任何主要记录)。您不需要在问题标题中添加[[已解决]]。 *您已经做了相应的事情并检查了刻度标记。 – mario

回答

2
$like = array(); 
$keywords = explode(',' , $keywords); 
foreach($keywords as $keyword) { 
    $like[] = "`keywords` LIKE '%$keyword%'"; 
} 
$like = implode(' OR ', $like); 
$query = "SELECT * FROM `table` WHERE $like ORDER BY id DESC LIMIT 1"; 
2

你需要打破的关键字,然后针对每一个

SELECT * FROM mytable 
WHERE keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' 
-- ... 

单独LIKE比较你可以做这样的事情

<?php 

$keywords = 'spaghetti,macaroni,hamburger'; 

$query = "SELECT * FROM mytable WHERE 1=1"; 

$keywords = explode(',', $keywords); 

if (count($keywords)) { 
    $query .= sprintf(
     " AND (%s)", 
     implode(' OR ', array_map(function($word){ 
      return "keywords LIKE '%{$word}%'"; 
     }, $keywords)) 
    ); 
} 

echo $query; 

// SELECT * FROM mytable WHERE 1=1 AND (keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%' OR keywords LIKE '%hamburger%') 

正如您从注释中看到,有更好的方法来处理这个问题,但我假设这个基本问题正在寻找一个简单的答案。

我没有做任何输入清理,或者添加其他任何失败保险箱。像这样构建查询不是很可靠,您应该继续学习PHP/MySQL,以避免将来出现常见的陷阱。不过,我相信目前有更多先进的方法有点不足。如果有人想提供更好的技术,他们认为OP可以把握,通过各种手段,去了:)

+0

或'和',在这个问题的意图还不清楚... – Ben

+2

注意查询优化器不能优化'LIKE“%意大利面条%”的关键字或关键字LIKE“%通心粉%”',这将成为一个连续的扫描,不使用索引。归一化可能是更好的解决方案,因为索引可用于例如'关键字IN('通心粉','意大利面条')' –

+2

@FrankFarmer - 这是OP描述的问题的一个方面。没有答案永远不会避免。 – MatBailie

1

试试这个,它可能比使用多个or条款

Select * from mytable 
where keywords REGEXP 'spaghetti|macaroni|hamburger' 
+1

我编辑了你的帖子;您正在使用第一个标记'[PHP]'为Google Prettify标记,因此被抓出来。这可以通过HTML注释来改变,对于SQL <! - language:lang-sql - >' – Ben

1

你更快必须使用LIKE与separeted的作品,你可以试试这个:

$keywords = 'spaghetti,macaroni,hamburger'; 

$arrayWords = explode(',', $keywords); 

$like = ''; 

foreach($arrayWords as $word) 
    $like .= empty($like) ? " keywords LIKE '%$word%' " : " OR keywords LIKE '%$word%' "; 

mysql_query("SELECT * FROM ---- WHERE $like ORDER BY id DESC LIMIT 1"); 
1
mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%". implode("%' OR keywords LIKE '%", explode(",", $keywords)) ."%' ORDER BY id DESC LIMIT 1");