我有一个查询,该查询返回带有一些表中某些ID的结果集。如果获得具有相同QuestionID的两行或更多行,我只希望具有MAX(QuestionSessionID)的一行。我该如何实现?
我用子查询尝试了很多不同的变体,但是没有成功。如何实现呢?
查询:
SELECT AQS.QuestionSessionID, AQS.QuestionID, AQS.AnswerTextMarkerID, AQS.Correct, QG.ID AS QuestionGroupID
FROM AnswerQuestionSession AQS
JOIN QuestionSession QS ON QS.UserID = 3
JOIN Question Q ON AQS.QuestionID = Q.ID
JOIN QuestionGroup QG ON Q.QuestionGroupID = QG.ID
WHERE AQS.AnswerTextMarkerID IN (109,110,113,114,118,121,141,146,148,152,156,157,158,172,182,183,193,194,196,197,198,211,222,227,241,242,243,257,263,271,282,283,356,396,643,644,938,939,943,944,955,956,957,958,959,970,971,972,973,978,979,1110,1111,1112,1113,1114,1115,1116,1117,1118,1120,1121,1163,1164,1165,1166,1205,1240)
AND AQS.QuestionSessionID = QS.ID
ORDER BY AQS.QuestionID, AQS.QuestionSessionID DESC;
当前结果集:
QuestionSessionID QuestionID AnswerTextMarkerID Correct QuestionGroupID
294441 112 121 1 25
22942 112 121 0 25
22942 126 141 1 39
131489 216 257 1 102
22942 222 263 1 106
22942 227 271 1 110
294435 760 955 1 5
294435 760 956 1 5
因此,在上面的示例中,我只想要其中一个具有QuestionID 112的行(具有MAX(QuestionSessionID)294441的行),像这样:
所需的结果集:
QuestionSessionID QuestionID AnswerTextMarkerID Correct QuestionGroupID
294441 112 121 1 25
22942 126 141 1 39
131489 216 257 1 102
22942 222 263 1 106
22942 227 271 1 110
294435 760 955 1 5
294435 760 956 1 5
更新: 尝试按照评论者的建议添加另一个联接,但未正确。它似乎仅适用于具有多个相同QuestionID之一的行:
SELECT AQS.QuestionSessionID, AQS.QuestionID, AQS.AnswerTextMarkerID, AQS.Correct, QG.ID AS QuestionGroupID, MaxId
FROM AnswerQuestionSession AQS
JOIN QuestionSession QS ON QS.UserID = 3
JOIN Question Q ON AQS.QuestionID = Q.ID
JOIN QuestionGroup QG ON Q.QuestionGroupID = QG.ID
JOIN (SELECT QuestionID, MAX(QuestionSessionID) as MaxId
FROM AnswerQuestionSession
GROUP BY QuestionID) as mq ON mq.QuestionID = AQS.QuestionID
WHERE AQS.AnswerTextMarkerID IN (109,110,113,114,118,121,141,146,148,152,156,157,158,172,182,183,193,194,196,197,198,211,222,227,241,242,243,257,263,271,282,283,356,396,643,644,938,939,943,944,955,956,957,958,959,970,971,972,973,978,979,1110,1111,1112,1113,1114,1115,1116,1117,1118,1120,1121,1163,1164,1165,1166,1205,1240)
AND AQS.QuestionSessionID = QS.ID
/*AND AQS.QuestionSessionID = MaxId*/
ORDER BY AQS.QuestionID, AQS.QuestionSessionID DESC;
QuestionSessionID QuestionID AnswerTextMarkerID Correct QuestionGroupID MaxId
294441 112 121 1 25 294441
22942 112 121 0 25 294441
22942 126 141 1 39 293891
131489 216 257 1 102 294071
22942 222 263 1 106 294013
22942 227 271 1 110 294013
294435 760 958 1 5 294435
294435 760 959 1 5 294435
294435 760 955 1 5 294435
294435 760 956 1 5 294435
294435 760 957 1 5 294435
294435 771 970 1 241 294435
294435 771 971 1 241 294435
294435 771 972 1 241 294435
294435 776 978 1 245 294435
131489 962 1205 1 318 293592
更新2:
在评论者的帮助下,我对其进行了一些小的修改就可以按预期工作:
工作查询:
SELECT AQS.QuestionSessionID, AQS.QuestionID, AQS.AnswerTextMarkerID, AQS.Correct, QG.ID AS QuestionGroupID
FROM AnswerQuestionSession AQS
JOIN QuestionSession QS ON AQS.QuestionSessionID = QS.ID
JOIN Question Q ON AQS.QuestionID = Q.ID
JOIN QuestionGroup QG ON Q.QuestionGroupID = QG.ID
JOIN (SELECT QuestionID, MAX(QuestionSessionID) as MaxId
FROM AnswerQuestionSession AQS2
JOIN QuestionSession QS2 ON AQS2.QuestionSessionID = QS2.ID
WHERE QS2.UserID = 3
GROUP BY QuestionID) as mq ON mq.QuestionID = AQS.QuestionID
WHERE AQS.AnswerTextMarkerID IN (109,110,113,114,118,121,141,146,148,152,156,157,158,172,182,183,193,194,196,197,198,211,222,227,241,242,243,257,263,271,282,283,356,396,643,644,938,939,943,944,955,956,957,958,959,970,971,972,973,978,979,1110,1111,1112,1113,1114,1115,1116,1117,1118,1120,1121,1163,1164,1165,1166,1205,1240)
AND QS.UserID = 3
AND AQS.QuestionSessionID = MaxId;
答案 0 :(得分:1)
针对AnswerQuestionSession
表上的子查询添加JOIN
JOIN (SELECT QuestionID, MAX(QuestionSessionID as MaxId)
FROM AnswerQuestionSession
GROUP BY QuestionID) as mq ON mq. QuestionID = Aqs. QuestionID
,然后在WHERE
子句中使用它
AND Aqs.QuestionSessionID = MaxId
这基于更新的问题,我更改了QuestionSession上的联接,还确保在WHERE子句中使用了MaxId。
SELECT AQS.QuestionSessionID, AQS.QuestionID, AQS.AnswerTextMarkerID, AQS.Correct, QG.ID AS QuestionGroupID
FROM AnswerQuestionSession AQS
JOIN QuestionSession QS ON AQS.QuestionSessionID = QS.ID
JOIN Question Q ON AQS.QuestionID = Q.ID
JOIN QuestionGroup QG ON Q.QuestionGroupID = QG.ID
JOIN (SELECT QuestionID, MAX(QuestionSessionID) as MaxId
FROM AnswerQuestionSession
GROUP BY QuestionID) as mq ON mq.QuestionID = AQS.QuestionID
WHERE AQS.AnswerTextMarkerID IN (109,110,113,114,118,121,141,146,148,152,156,157,158,172,182,183,193,194,196,197,198,211,222,227,241,242,243,257,263,271,282,283,356,396,643,644,938,939,943,944,955,956,957,958,959,970,971,972,973,978,979,1110,1111,1112,1113,1114,1115,1116,1117,1118,1120,1121,1163,1164,1165,1166,1205,1240)
AND QS.UserID = 3
AND AQS.QuestionSessionID = MaxId
ORDER BY AQS.QuestionID, AQS.QuestionSessionID DESC;