2013-11-22 98 views
0

我有這個表,記錄考試成績爲用戶:東西,因爲集團的MySQL查詢怪BY語句

CREATE TABLE IF NOT EXISTS `ts` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `uid` int(11) NOT NULL, 
    `xid` int(11) NOT NULL, 
    `lid` int(11) NOT NULL, 
    `grade` double NOT NULL, 
    `duration` varchar(10) COLLATE utf8_turkish_ci NOT NULL, 
    `trues` int(11) NOT NULL DEFAULT '0', 
    `falses` int(11) NOT NULL DEFAULT '0', 
    `empties` int(11) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`id`), 
    KEY `uid` (`uid`), 
    KEY `xid` (`xid`), 
    KEY `lid` (`lid`), 
) ENGINE=InnoDB; 

而且我有這個表中的記錄:

|id|uid|xid|lid|grade|duration|trues|falses|empties|  
+--+---+---+---+-----+--------+-----+------+-------+ 
|45| 20| 1| 1| 80|00:01:12| 8|  2|  0| 
|46| 20| 1| 2| 40|00:02:31| 4|  6|  0| 
|47| 20| 3| 1| 100|00:01:10| 1|  0|  0| 
|48| 20| 4| 1| 83|00:00:51| 5|  1|  0| 
|49| 20| 2| 1| 0|00:00:02| 0|  1|  0| 
|53| 20| 4| 2| 50|00:00:04| 1|  1|  0| 
|54| 20| 1| 2| 50|00:00:41| 5|  5|  0| 

lid指示由xid表示的考試難度級別。我想以獨特的水平展示每個獨特考試的最高成績。例如有7行。和id [46]和id [54]適用於相同的考試和級別。所以我必須在這兩行中列出更高等級的值。

我已經做了查詢:

SELECT 
     failed.fgrade, 
     succeeded.sgrade, 
     ts.xid, 
     ts.lid, 
     ts.trues, 
     ts.falses, 
     ts.empties, 
     MAX(`grade`) AS grade, 
     ts.duration, 
     x.exam 
FROM 
     ts 
JOIN 
     x ON ts.xid = x.id 
JOIN 
     (SELECT 
      COUNT(DISTINCT(xid)) AS sgrade 
     FROM ts 
     WHERE uid = 20 AND grade >= 70) AS succeeded 

JOIN 
     (SELECT 
      COUNT(DISTINCT(xid)) AS fgrade 
     FROM ts 
     WHERE uid = 20 AND grade < 70) AS failed 

WHERE 
     ts.uid = 20 

GROUP BY 
     xid, 
     lid 
ORDER BY 
     ts.id 

當我運行查詢時得到奇怪的結果:(!)

Exam Name Level Duration  True False Empty Total Grade fgrade sgrade 
Functions  1 00:00:02  0  1  0  1  0  3  3 
Numbers  2 00:02:31  4  6  0  10 50  3  3 (!) 
Equations  2 00:00:04  1  1  0  2 50  3  3 
Numbers  1 00:01:12  8  2  0  10 80  3  3 
Equations  1 00:00:51  5  1  0  6 83  3  3 
Functions  1 00:01:10  1  0  0  1 100  3  3 

如果你看一下在結果表中的行有什麼奇怪的。 4個正確的答案和6個錯誤的答案可以得到40分。但它顯示了其他行的等級值,同時顯示了自己的真實和錯誤答案。

我基本上希望針對給定用戶的每個難度級別(uid)顯示所有不同的考試。現在,當我寫這個問題時,我開始認爲這可能是由於GROUP BY聲明造成的。但是寫這個問題需要一段時間。我不能刪除這個。

+0

哪裏'ON'爲了你最後2加入?真的,爲什麼那些連在一起呢? –

回答

1

考慮下面兩行:

|46| 20| 1| 2| 40|00:02:31| 4|  6|  0| 
|54| 20| 1| 2| 50|00:00:41| 5|  5|  0| 

當由XID基,蓋只有一行被選擇(第一行)

|46| 20| 1| 2| 40|00:02:31| 4|  6|  0| 

但對於最大(級),它是一種聚合功能,這意味着它會查找所有結果行獲取最大值 - >最大(等級)回報50.
- >如果您在等級中選擇了等級和最高等級,您將同時收到40和50.

在你的情況,我認爲你應該加入兩個TS表獲得更高的價值等級是這樣的:

select ts1.* from ts ts1 left join ts laster on ts1.xid = laster.xid and ts1.lid = laster.lid 
and ts1.uid = laster.uid and ts1.grade < laster.grade where isnull(laster.grade) 
+0

ts2是什麼? – zkanoca

+0

抱歉,輸入錯誤,ts2代表激光。 –