2

用户输入 1 到 6 个字(特征),因此所有输入数据为 6 个字。这是我的桌子:

----------------
| USER |  WORD |
----------------
   1   |  Green
   1   |  Black
   1   |  Red
   2   |  Green
   2   |  Gray

例如,数组由 2 个单词组成:“Green”、“Black”。如果其特征中的连词数量最大,我如何接收“User=1”。我已经尝试过这个查询:

// $pat - array of words
// $nums - minimal amount of conjunctions.
$nums = 0.8*count($pat)

SELECT user
FROM words
WHERE word IN ('{$pat[0]}', '{$pat[1]}','{$pat[2]}','{$pat[3]}','{$pat[4]}','{$pat[5]}')
GROUP BY `user`
HAVING count(*) >= ".$nums."
ORDER BY count(*) DESC
LIMIT 1

问题是条件HAVING count(*) >= ".$nums."不能正常工作,即使只有一个合取也会提取数据。

4

1 回答 1

3

我相信您的查询运行良好

如果我们有两个词“Green”和“Black”

SELECT user
  FROM words
 WHERE word IN ('Green', 'Black')
 GROUP BY user
HAVING COUNT(*) >= (0.8 * 2)
 ORDER BY COUNT(*) DESC
 LIMIT 1;

正如预期的那样,只有用户 1 有两个词(大于 0.8 * 2):

| 用户 |
--------
| 1 |

现在如果我们有 5 个词

SELECT user
  FROM words
 WHERE word IN ('Green', 'Black', 'Red', 'Green', 'Gray')
 GROUP BY user
HAVING COUNT(*) >= (0.8 * 5)
 ORDER BY COUNT(*) DESC
 LIMIT 1;

结果集是空的(再次如预期的那样),因为没有用户至少有四个 (0.8 * 5) 个单词。

这是SQLFiddle演示

因此,您似乎没有告诉我们什么,或者您的真实数据可能不同


可能的原因之一可能是同一用户存在具有相同单词的重复行。如果是这种情况,您可以在表上强制执行带有UNIQUE约束的限制或使用COUNT(DISTINCT word)

SELECT user
  FROM words
 WHERE word IN ('Green', 'Black')
 GROUP BY user
HAVING COUNT(DISTINCT word) >= (0.8 * 2)
 ORDER BY COUNT(DISTINCT word) DESC

这是SQLFiddle演示

于 2013-07-23T20:55:38.473 回答