SQL: MATCH AGAINST 数组中的所有元素

SQL: MATCH AGAINST all elements in an array

我有一个 "tags" 数组存储在 cookie 中。它们被格式化为由 , 分隔的一系列单词。我正在尝试 return table 中的所有行,其中每个 "tag" 都在 "search_tags" 列中找到。

我目前有:

$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('". $_COOKIE['tags'] ."' IN BOOLEAN MODE);");

这几乎行得通,但是 return 是任何标签匹配的所有行。而不是要求所有 $_COOKIE['tags'] 匹配 "search_tags" 列。

另一种解决方案可能是它保留为 OR 查询,而是按匹配数或相关性对结果进行排序。

您可以在 boolean mode 中使用 + 运算符来断言必须存在一个词,因此如果您将标签从逗号分隔列表转换为 + 分隔列表这应该会给你你想要的结果:

$tags = '+' . implode(' +', explode(',', $_COOKIE['tags']));
$stmt = $conn->prepare("SELECT * FROM users WHERE MATCH search_tags AGAINST('$tags' IN BOOLEAN MODE);");

请注意,如果逗号后可能有空格,则应使用 preg_split('/,\s*/', $_COOKIE['tags']) 而不是 explode