2011-11-21 91 views
0

我正在爲一個flashcards應用程序設計一個MySQL數據庫。我有一張名爲「課程」的表格,我在那裏保存課程的ID,名稱和說明以及一張名爲「物品」的表格,我在這裏保留了所有的抽認卡。表格項目保存唯一的ID,課程ID以及問題,答案和更多詳細信息。還有一張名爲重複的表格,我在那裏存儲用戶記憶的閃卡的數據。如果我想得到一個用戶還沒有記憶的flashcard,我使用LEFT JOIN查詢數據庫,以便從閃存卡中獲取所有數據,並從重複的行中獲取所有數據。但是,我必須指定何去何從一定的燒錄卡所屬的,所以我的查詢看起來更Ø多少有點像:我應該爲flashcards應用使用單獨的表嗎?

SELECT * 
    FROM (SELECT * 
       FROM flashcards 
       WHERE course='coursename') AS flashcards 
     LEFT JOIN repetitions 
      ON flashcards.id=repetitions.flashcardid 
    WHERE repetitions.lastrepetition IS NULL 
    LIMIT 1; 

它會更好有各門課程separare表,這樣我就不必指定我的意思是什麼?這會加快數據庫嗎?不會有很多課程(約10-20),每門課程將包含大約5k-10k的卡片。

對不起,我忘了說,如果用戶沒有記憶閃卡,那麼在表重複中就不會有任何等價的記錄。我實際做的是: 1.我選擇所有的flashards在哪裏coursename ='coursename', 2.我選擇所有重複WHERE用戶='用戶'和coursename ='coursname, 3.然後我左加入記錄第一個表與第二個表中的記錄。我從某個過程中獲得所有的flashcards,其中一些記錄在重複表中有相應的等效形式, 4.然後我使用WHERE重複爲NULL,並且我只獲得那些在重複表中沒有其等價物的flashcards。

SELECT * FROM 
    (SELECT * FROM flashcards WHERE course='coursename') AS f 
    LEFT JOIN 
    (SELECT * FROM repetitions WHERE user='user' AND course='coursename') AS r 
    ON f.id=r.flashcardid 
    WHERE repetitions IS NULL LIMIT 1) 

上述查詢工作正常,但我不知道它是否不會需要太多的RAM /內存,如果有更多的人使用的應用程序。

我有atm唯一更好的解決方案是從flashcards表中只選擇id並將LIMIT設置爲用戶的限制(假設每個會話有30個flashcards)。然後,而不是30次,我將只使用此查詢一次。我可以在GET變量中傳遞這些id。 (這個解決方案的唯一問題是,如果用戶在他的PC上研究閃存卡,然後移動到手機並忘記關閉PC的會話並返回到個人電腦,一些重複可能會被覆蓋。無論如何,這將是一個非常罕見的情況,但仍有可能)。


感謝您的幫助!你的建議實際上是正確的。我剛纔發現我犯了一個錯誤 - 在我最初的查詢中,我不必要地添加了'WHERE repetitions.course ='coursename'的情況。 但是,我仍然必須使用右括號來確定用戶。

SELECT * FROM flashcards AS f 
LEFT JOIN (SELECT * FROM repetitions WHERE user='username') AS r 
ON f.id=r.flashcardid 
WHERE f.course='coursename' AND r IS NULL 

回答

0

你不應該把課程分成自己的表格。

難道你不能這樣做嗎?

select * from flashcards 
left join repititions 
    on flashcards.id = repititions.flashcardid 
where course = 'coursename' 
and repititions.lastrepitition is null 
limit 1 
0

我看不出有任何理由爲每門課程添加單獨表的開銷和麻煩。另外,不需要該子查詢。您的查詢可寫爲:

SELECT * 
    FROM flashcards f 
     LEFT JOIN repetitions r 
      ON f.id = r.flashcardid 
    WHERE f.course = 'coursename' 
     AND r.lastrepetition IS NULL 
    LIMIT 1; 
+0

嗨!感謝您的回答。不幸的是,這個查詢不起作用。如果用戶還沒有研究過flashcard,那麼在右表中就不會有任何記錄,並且如果我在兩個表上都使用WHERE,我將不會從左表中獲取所有記錄,但只有那些具有其等價物的記錄在右邊的表格中。 – lukeshek

+0

我用這個查詢ATM: 選擇items.id,items.question,items.answer FROM(SELECT ID,問題,回答的項目WHERE courseid = '$ courseid')AS LEFT JOIN項目(SELECT itemid的FROM重複其中userid = '$用戶ID' AND courseid = '$ courseid')AS重複ON items.id = repetitions.itemid WHERE repetitions.itemid IS NULL LIMIT 1 – lukeshek

+0

我不知道,也許這將是更好的,如果我有兩個表中的記錄等同?但是,如果我添加一個新的flashcard到一個擁有3k用戶的課程中,我必須確保每個用戶在右表中有一個單獨的等價物,所以我會在左邊添加一個記錄表和3K記錄到右表... 我不確定括號內的查詢會發生什麼情況? MySQL是否必須爲這些記錄創建一個臨時表? – lukeshek