簡體   English   中英

SQL子查詢/左聯接問題

[英]SQL Subquery/Left Join Issue

我正在一個學生進行測驗的項目中-有一些限定詞是,他們只能參加(按班級)注冊的測驗,並且每個測驗只能參加一次。 我已經弄清楚了大部分。.但是我正在處理一個SELECT語句,以便在下拉菜單中使用。 我有一個問題。

相關結構,僅包含列名:

用戶表

  • 用戶身份

測驗表

  • QuizID

完整表

  • 用戶身份
  • QuizID

因此,基本上,在完成測驗之后,所有結果都將轉到另一個名為“結果”的表中,但是還會在“完成”表中創建一個條目,其中記錄了用戶的ID和測驗ID。 然后,我執行以下SQL語句來填充下拉列表。

SELECT Quiz.QuizID, Quiz.QuizName
FROM Quiz
LEFT JOIN Complete ON Complete.QuizID = Quiz.QuizID
WHERE Complete.QuizID IS NULL
AND Quiz.Class = 'History'

哪個可行-從技術上講。 但是您會看到這里的問題是什么..如果“歷史記錄”課程中的某人參加了考試..那么“歷史記錄”課程中的其他人都無法參加該考試。 所以我必須用用戶ID分開。 我已經嘗試過類似的東西:

SELECT Quiz.QuizID, Quiz.QuizName
FROM Quiz
LEFT JOIN Complete ON Complete.QuizID = Quiz.QuizID
WHERE Complete.QuizID IS NULL
AND Quiz.Class = 'History'
AND Complete.UserID = (SELECT UserID
FROM User
WHERE UserID = '2')

其中“ 2”是會話用戶ID的占位符-也是測試者,因為我有兩個歷史記錄測試,並且我有一個條目說該學生參加了其中的一個。 但是我無法正常工作。

對我在這里做錯的任何幫助嗎?

將條件UserID移到on子句:

SELECT Quiz.QuizID, Quiz.QuizName
FROM   Quiz
LEFT JOIN 
       Complete 
ON     Complete.QuizID = Quiz.QuizID
       AND Complete.UserID = '2'
WHERE  Complete.QuizID IS NULL
       and Quiz.Class = 'History'

現在,它將僅查找用戶2 Complete記錄。

這是您要找的東西嗎? 它將您的userId檢查移動到您的JOIN條件:

SELECT Quiz.QuizID, Quiz.QuizName
FROM Quiz
   LEFT JOIN Complete ON Complete.QuizID = Quiz.QuizID
      AND Complete.UserID = 2
WHERE Complete.QuizID IS NULL
   AND Quiz.Class = 'History'

通過在您的WHERE條件中檢查userId,它使LEFT JOIN 如果Complete.UserId = 2,則Complete.QuizId絕不能為NULL

建議的其他解決方案應該可以使用,但是如果您想將where條件與join子句分隔開,我認為一個簡單的OR應該可以解決問題:

   SELECT Quiz.QuizID, 
          Quiz.QuizName
     FROM Quiz
LEFT JOIN Complete 
       ON Complete.QuizID = Quiz.QuizID
    WHERE (Complete.QuizID IS NULL -- let's show the quiz never completed
          OR
           Complete.UserID <> 2    -- or completed by someone who isn't 2 :)
          )
      AND Quiz.Class = 'History'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM