1

假设您正在运行一个查询,并且您有很多不同的用户输入可能找不到完全匹配的内容。现在是否可以执行以下操作?

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

    ....
4

1 回答 1

2

是的,这是可能的,尽管您会在没有WHERE子句的情况下这样做,并且您希望将所有输​​入相加而不是使用 aCASE来获得总分。由于每个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 提供了跨 MyISAM 表的多个列创建全文索引的可能性。

更新:要人为地给它们加权...

如果您需要对它们进行加权,请使用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";

MATCH同样,要明确一点 - MySQL 的全文索引和关键字中已经内置并优化了一个非常密切相关的功能。

于 2012-07-19T20:03:51.483 回答