【发布时间】:2015-01-07 13:17:38
【问题描述】:
注意:您可以在此处找到上一个问题及其答案。对其进行深入测试证明之前的答案是错误的:Writing a Complex MySQL Query
我有 3 张桌子。
表Words_Learned 包含用户已知的所有单词,以及单词的学习顺序。它有 3 列 1) 单词 ID 和 2) 用户 ID 和 3) 单词的学习顺序。
表Article 包含文章。它有 3 列 1) 文章 ID、2) 唯一字数和 3) 文章内容。
表Words 包含每篇文章中包含的所有唯一词的列表。它有 2 列 1) 单词 ID 和 2) 文章 ID
数据库图如下/
现在,使用这个数据库并使用“仅”mysql,我需要做以下工作。
给定一个用户 ID,它应该得到一个该用户知道的所有单词的列表,按照他们学习的顺序排序。换句话说,最近学习的单词将位于列表的顶部。
假设对用户 ID 的查询表明他们已经记住了以下 3 个单词,我们会跟踪他们学习这些单词的顺序。 章鱼 - 3 狗 - 2 勺子 - 1
首先我们得到包含单词 Octopus 的所有文章的列表,然后使用表 Words 仅对这些文章进行计算。计算意味着如果该文章包含超过 10 个未出现在用户词汇表中的单词(从表 words_learned 中提取),则将其从列表中排除。
然后,我们查询所有包含 dog 但不包含“octopus”的记录
然后,我们查询所有包含spoon但不包含单词Octopus或Dog的记录
您会一直重复这个过程,直到我们找到 100 条符合此条件的记录。
为了实现这个过程,我做了以下(请访问 SQLFiddle 链接以查看表结构、测试数据和我的查询)
http://sqlfiddle.com/#!2/48dae/1
在我的查询中,您可以看到生成的结果,它们是无效的。但是在“正确查询”上,结果应该是,
Level 1
Level 1
Level 1
Level 2
Level 2
Level 2
Level 3
Level 3
这是一个 phudocode 以便更好地理解。
Do while articles found < 100
{
for each ($X as known words, in order that those words were learned)
{
Select all articles that contain the word $X, where the 1) article has not been included in any previous loops, and 2)where the count of "unknown" words is less than 10.
Keep these articles in order.
}
}
【问题讨论】:
标签: mysql sql database join indexing