2014-10-29 98 views
0

我有3個表。在這裏,我張貼它的數據庫圖。MySQL:寫一個複雜的查詢

enter image description here

你可以從這裏下載DB代碼:https://www.dropbox.com/s/lk956afaxv147h0/testS.sql?dl=0

現在,使用這個數據庫,並使用「唯一」的MySQL,我需要做下面的工作。

1)給定一個用戶ID,它應該得到這個用戶已知的所有單詞列表,按照他們學習的順序排序。換句話說,最近學過的單詞將在列表的頂部。

2)您將獲得包含從表中這個特別的字「言」

3)您將瀏覽這份清單,並從表「文章」,它包含最多10返回所有記錄的所有文章的列表「未知詞語。換句話說,如果該文章包含10個以上未出現在用戶詞彙列表中的單詞(從表格「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

3可以用一些GROUP BY與後期聚合過濾(HAVING) – Mihai 2014-10-29 11:38:16

+0

@Mihai:感謝您的回覆。你能用代碼發表明確的答案嗎?理解會很有幫助。 – 2014-10-29 11:39:23

+0

請注意,使用諸如COUNT之類的關鍵字和/或諸如ORDER之類的保留字作爲表格/列標識符是災難的祕訣。COUNT是一個特別奇怪的因爲它不包含在MySQL的保留字列表中 - 但只是你嘗試創建一個名爲COUNT的表! – Strawberry 2014-10-29 11:42:21

回答

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

+0

謝謝你的答覆。但我認爲你錯過了這一點 - 換句話說,如果該文章包含超過10個單詞沒有出現在用戶的詞彙表中(從表「Words_Learned」拉出),那麼它被排除在外該列表。' – 2014-10-30 07:48:56

+0

對不起,我認爲這個作品!但是,請讓我知道我如何獲得「文章」的細節?因爲問題是「你將掃描這個列表並返回來自表文章' – 2014-10-30 08:00:21

+0

的所有記錄,我認爲這些步驟描述了你需要做什麼來找到沒有難以閱讀的文章存在的單詞。一步就是找到所有包含最多10個未知單詞的文章。這並不意味着您必須展示這些文章,您只需要瞭解它們以獲得最終結果(或者使用描述「換句話說,如果該文章包含超過10個單詞......」,就像我一樣)。 – 2014-10-30 08:16:37

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)您將獲得包含從表「單詞」這個特別的字全部文章的列表值

SELECT 
    * 
FROM 
    article ar 
INNER JOIN 
    words ws 
ON 
    ar.idArticle = ws.idArticle 
AND 
    ws.idwords is like '%pe%' 

這將選擇所有有子PE喜歡狙擊等字樣。您也可以通過將*替換爲ar.content

+0

我的問題是關於第3點和第4點。我已經完成了你提供的答案。 – 2014-10-29 13:13:00