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
。
我有一个 "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
。