如何使用CASE语句为查询中的匹配项赋值?

时间:2012-07-19 19:27:33

标签: php mysql case mysql-num-rows

假设您运行查询并且您有许多不同的用户输入可能找不到完全匹配。现在可以做以下的事情吗?

$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{

    ....

1 个答案:

答案 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关键字中进行了优化。