MySQL:编写复杂的查询

时间:2014-10-29 11:36:27

标签: mysql sql database select join

我有3张桌子。我在这里发布它的数据库图表。

enter image description here

您可以从此处下载数据库代码: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点,我需要做些什么呢?

2 个答案:

答案 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

即可选择文章内容