我有3张桌子。我在这里发布它的数据库图表。
您可以从此处下载数据库代码:https://www.dropbox.com/s/lk956afaxv147h0/testS.sql?dl=0
现在,使用此数据库并仅使用"" mysql,我需要做以下工作。
1)给定一个用户ID,它应该得到该用户已知的所有单词的列表,按照学习它们的顺序排序。换句话说,最近学过的单词将位于列表的顶部。
2)您将从表格中获得包含此特定单词的所有文章的列表"单词"
3)您将扫描此列表并返回表格中的所有记录"文章"其中包含最多10个“未知”单词。换句话说,如果该文章包含超过10个未出现在用户词汇表列表中的单词(从表格#34; Words_Learned"中提取),那么它将从列表中排除。
4)然后,继续执行步骤1中列表中的下一条记录。重复相同的过程,但跳过从步骤3返回的任何文章或在步骤3中作为过滤过程的一部分排除
为了实现这个过程,我做了以下
SELECT `words_learned`.`idwords`,
Words.`idArticle`
FROM words_learned
INNER JOIN Words ON Words.idWords = Words_Learned.`idwords`
WHERE words_learned.userId = 1
ORDER BY Words_Learned.`order` DESC
在我的查询中,我已经涵盖了第1点和第2点。但是为了覆盖第3点和第4点,我需要做些什么呢?
答案 0 :(得分:1)
换句话说:显示所有没有难以阅读的文章的学习单词。我并没有像建议的那样一步一步地做到这一点。这是我的疑问:
select *
from words_learned
where userid = 1
and not exists
(
-- word being used in at least one article with too many unknown words
select *
from words
where words.idwords = words_learned.idwords
and words.idarticle in
(
-- articles with more then 10 unknown words
select w.idarticle
from words w
left join words_learned l on l.idwords = w.idwords and l.userid = 1
group by w.idarticle
having count(*) - count(l.idwords) > 10
)
)
order by `order` desc;
这是一个SQL小提琴:http://sqlfiddle.com/#!2/6de6a/4。
答案 1 :(得分:0)
回答 1)给定一个用户ID,它应该得到该用户已知的所有单词的列表,按照学习它们的顺序排序。换句话说,最近学过的单词将位于列表的顶部。
SELECT ar.content
FROM article ar INNER JOIN words ws ON ar.idArticle = ws.idArticle
INNER JOIN words_learned wl ON wl.idwords = ws.idwords AND wl.userid = @givenID
ORDER BY ar.content DESC
此处@givenID
提供了用户ID,据我所知,内容将保留学习单词的价值
2)您将从表格“Words”中获得包含此特定单词的所有文章的列表
SELECT
*
FROM
article ar
INNER JOIN
words ws
ON
ar.idArticle = ws.idArticle
AND
ws.idwords is like '%pe%'
这将选择具有子串pe的所有单词,如狙击手等。此外,您只需将*
替换为ar.content