假设您运行查询并且您有许多不同的用户输入可能找不到完全匹配。现在可以做以下的事情吗?
$query = "SELECT *,
CASE matchingValues
WHEN $field1 LIKE '$a' THEN value = '1' ELSE value = '0'
WHEN $field2 LIKE '$b' THEN value = '1' ELSE value = '0'
WHEN $field3 LIKE '$c' THEN value = '1' ELSE value = '0'
WHEN $field4 LIKE '$d' THEN value = '1' ELSE value = '0'
WHEN $field5 LIKE '$e' THEN value = '1' ELSE value = '0'
END AS score
FROM . $usertable
WHERE
$field1 LIKE '$a' AND
$field2 LIKE '$b' AND
$field3 LIKE '$c' AND
$field4 LIKE '$d' AND
$field5 LIKE '$d'
ORDER BY score DESC";
if($result = mysql_query($query)) {
if(mysql_num-rows($result)==NULL) {
echo 'No Results Found';
}else{
....
答案 0 :(得分:2)
是的,虽然你可以在没有WHERE
子句的情况下这样做,但是你想要添加所有输入而不是使用CASE
来获得总分。由于每个LIKE
语句都返回一个布尔值1或0,您可以将它们添加起来以找出您有多少匹配。然后HAVING
子句限制返回的分数> 0,如果你只想返回实际匹配的那些。
SELECT *,
(($field1 LIKE '$a') +
($field2 LIKE '$b') +
($field3 LIKE '$c') +
($field4 LIKE '$d') +
($field5 LIKE '$e')) AS score
FROM . $usertable
HAVING score > 0
ORDER BY score DESC";
我们假设您已在%
个变量中添加了LIKE
个通配符,并且在查询中使用它们之前已经正确转义。
然而,虽然你可以这样做(一个穷人的全文搜索),MySQL提供了创建full text index across multiple columns on MyISAM tables的可能性。
如果您需要对它们进行加权,请使用CASE
语句并为前几个语句输入更高的数字:
SELECT *,
(CASE WHEN ($field1 LIKE '$a') THEN 5 ELSE 0 END +
CASE WHEN ($field2 LIKE '$b') THEN 4 ELSE 0 END +
CASE WHEN ($field3 LIKE '$c') THEN 3 ELSE 0 END +
CASE WHEN ($field4 LIKE '$d') THEN 2 ELSE 0 END +
CASE WHEN ($field5 LIKE '$e') THEN 1 ELSE 0 END) AS score
FROM . $usertable
HAVING score > 0
ORDER BY score DESC";
要强制执行第一个匹配,请将其放在WHERE
子句中。
SELECT *,
(($field1 LIKE '$a') +
($field2 LIKE '$b') +
($field3 LIKE '$c') +
($field4 LIKE '$d') +
($field5 LIKE '$e')) AS score
FROM . $usertable
WHERE $field1 LIKE '$a'
HAVING score > 0
ORDER BY score DESC";
同样,要清楚 - 一个非常密切相关的功能已经内置并在MySQL的全文索引和MATCH
关键字中进行了优化。