SQL 查询 - 按另一列对一组列进行排序

SQL query - order one group of columns by another column

我打算创建一个包含数百万行的 table,按以下方式组织:

file,word,occurrences

file23,apples,343<br>
file17,apples,3<br>
file10341,apples,0<br>
...<br>
file16000,apples,0

这个 table 将有 16,000 个不同的词,它们出现在 16,000 个不同的文件中。

我想找到一种查询 table 的方法,方法是定位特定词,然后仅查找最相关的结果 - 即出现次数最多的前 10 个文件。

我尝试了以下代码及其变体,但没有成功:

WHERE/HAVING `word`=('apples', 'oranges', 'prunes') ORDER BY `occurrences` DESC

话虽如此,我如何执行此查询,即专门关注相关词,按出现次数列出它们,并获取前 10-15 个最相关的文件?

简单的 order by with Limit 应该可以。

select file, word, occurrences from yourtable where word in ('apples', 'oranges', 'prunes')  ORDER BY occurrences DESC
Limit 10

** 而不是 word=('apples', 'oranges', 'prunes') 你需要在 ('apples', 'oranges', 'prunes')

** 因为没有 group by 子句所以不需要 having

这就是 FULLTEXT 索引的用途。 table 每个文件只有一行,所以只有 16K 行。将有一个 TEXT 列包含该文件中的单词。然后 MATCH(col) AGAINST("+apples +oranges" IN BOOLEAN MODE) 将提供包含所有这些词的行,以及相关性。 (“相关性”不完全是“发生”。)

如果您选择坚持当前的结构,则“出现次数”并未明确说明。如果一个文件中有 100 个苹果和 20 个橙子怎么办?这与每个出现 60 次的文件一样“相关”吗?是否应考虑带有 'apples' 但没有 'oranges' 的文件?还是所有给定的词都需要出现?

顺便说一句,这就是您要查找的语法:

`word` IN ('apples', 'oranges', 'prunes')

关于您的数据的问题。 (这可能会影响性能。)有多少 'files' 有一个典型的词?通常,有多少文件包含所有请求的词?

CREATE TABLE t (
    `file` VARCHAR(...) NOT NULL,
    `word` VARCHAR(...) NOT NULL,
    occurrences INT NOT NULL,
    PRIMARY KEY(`word`, `file`),
    INDEX(`file`)
) ENGINE=InnoDB;

SELECT `file`, SUM(occurrences) as tot_occ
    FROM t
    WHERE `word` IN ('apples', 'oranges', 'prunes')
    GROUP BY `file`
    ORDER BY tot_occ DESC
    LIMIT 10;