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;
我打算创建一个包含数百万行的 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;