查找逗号分隔关键字的列表


Finding a list of comma separated keywords

当我运行代码时,我无法检索我的目标条目,因为通过查询运行的关键字与数据库中的关键字不同。

关键字:

$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 个匹配的关键字。

我应该采取哪些不同的做法?

$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";
您需要

分解关键字并为每个关键字进行单独的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可以掌握,无论如何,去:)

将多个值作为 CSV 存储在列中是一种常见的 SQL 反模式。 它很难使用,甚至更难优化:

如何修复逗号分隔的厄运列表

你必须将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");
mysql_query("SELECT * FROM ---- WHERE keywords LIKE '%". implode("%' OR keywords LIKE '%", explode(",", $keywords)) ."%' ORDER BY id DESC LIMIT 1");

试试这个,它可能比使用多个or子句更快

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