当我运行我的代码时,我无法检索我所定位的条目,因为通过查询运行的关键字与数据库中的关键字不同。
关键词:
$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个匹配的关键字。
我应该做些什么?
答案 0 :(得分:2)
您需要拆分关键字并为每个关键字进行单独的LIKE
比较
SELECT * FROM mytable
WHERE keywords LIKE '%spaghetti%' OR keywords LIKE '%macaroni%'
-- ...
你可以做这样的事情
<?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可以掌握的更好的技术,那么一定要去实现它:)
答案 1 :(得分: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 :(得分:2)
将多个值作为CSV存储在列中是一种常见的SQL反模式。它很难使用,甚至更难以优化:
答案 3 :(得分:1)
试试这个,它可能比使用多个or
子句
Select * from mytable
where keywords REGEXP 'spaghetti|macaroni|hamburger'
答案 4 :(得分:1)
您必须使用LIKE
单独的单词,您可以尝试:
$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");
答案 5 :(得分:1)
mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%". implode("%' OR keywords LIKE '%", explode(",", $keywords)) ."%' ORDER BY id DESC LIMIT 1");