You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在同一条SQL查询中同时使用LIKE和MATCH AGAINST?

问题解决:SQL语句语法错误及优化建议
  • 语法错误修正:你的SQL语句里OR后面多写了一个WHERE,SQL语法要求WHERE子句只能有一个开头,多个条件直接用OR/AND连接即可。修正后的基础SQL如下:
SELECT * FROM posts WHERE title LIKE '%$search%' OR MATCH (title) AGAINST('$search' IN NATURAL LANGUAGE MODE)
  • 必须修复的SQL注入风险:直接把用户输入的$search拼进SQL语句里,属于高危写法,极易遭遇SQL注入攻击。建议用PDO预处理语句替代,示例代码:
$search = "user search";
$stmt = $connection->prepare("SELECT * FROM posts WHERE title LIKE ? OR MATCH (title) AGAINST(? IN NATURAL LANGUAGE MODE)");
$likeKeyword = "%{$search}%";
$stmt->execute([$likeKeyword, $search]);
$data = $stmt->fetchAll();
  • 实现你的需求逻辑:如果要区分短词用LIKE、长词/多词用MATCH AGAINST,可以先判断搜索词的状态,再选择对应查询逻辑,不用强行OR两个条件:
$search = trim("user search");
$wordCount = count(explode(' ', $search));
// 自定义判断规则:比如词数>1 或 单词语长>5时用全文搜索
if ($wordCount > 1 || strlen($search) > 5) {
    $stmt = $connection->prepare("SELECT * FROM posts WHERE MATCH (title) AGAINST(? IN NATURAL LANGUAGE MODE)");
    $stmt->execute([$search]);
} else {
    $stmt = $connection->prepare("SELECT * FROM posts WHERE title LIKE ?");
    $stmt->execute(["%{$search}%"]);
}
$data = $stmt->fetchAll();

内容的提问来源于stack exchange,提问作者Table

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 09:25:22