2017-09-25 48 views
1

我有它返回的信息是這樣一個複雜的SELECT查詢的最大值行:的MySQL找到現場

+------+-------+--------+ 
| a | b  | c  | 
+------+-------+--------+ 
| 2482 | 3681 | 58248 | 
| 2482 | 17727 | 139249 | 
| 2482 | 23349 | 170839 | 
| 3031 | 14877 | 122921 | 
| 3031 | 20691 | 156457 | 
| 3031 | 20932 | 157784 | 
+------+-------+--------+ 

,我試圖找出如何與最大值僅返回的行b爲a的每個值。 在here該解決方案看起來前途無量,但我無法使它工作,因爲我的出發點不是一個表,但查詢(或視圖,我猜),我得到一個錯誤

「ERROR 1146( 42S02):表「databasename.s」不存在」

當我嘗試指的是子查詢中對上述問題的方式:

select s.* from (SELECT blah blah complex) s where s.b = (select max(s2.b) from s s2 where s2.a = s.a); 

我敢肯定這是一個半問題的問題,但我已經抨擊了我的頭FF它幾個小時,根本不明白它不夠好,瀏覽我的出路吧...

編輯:我應該澄清什麼,我想作爲輸出:

+------+-------+--------+ 
    | a | b  | c  | 
    +------+-------+--------+ 
    | 2482 | 23349 | 170839 | 
    | 3031 | 20932 | 157784 | 
    +------+-------+--------+ 

MySQL版本是5.5.49(Ver 14.14 Distrib 5.5.49)

更新:@ Harshil的答案澄清說,我試圖在本質上是不可能的,所以我結束了其他問題的指導(由@Bill Karwin的指導)和重寫了我的原始查詢以執行另一個JOIN(針對子查詢),它執行max()。

+0

@Neilski,這是一個很常見的問題,你會發現很多解決方案都帶有[tag:greatest-n-per-group]標籤。 –

+0

比爾 - 謝謝,我會更仔細地諮詢這些答案,但乍一看他們似乎沒有人試圖分析一個查詢。用實際的表格似乎更容易... – Neilski

回答

0
select a,b,c from examp where (a,b) in (select a ,max(b) from examp group by a); 
+0

謝謝。您發佈的原始版本看起來很有前途,基本上可以處理我的示例數據,但我認爲它可能不適用於非單調數據。上面的新版本失敗了,因爲我自己的拙劣企圖,相同的「表」databasename.s'不存在「錯誤。 – Neilski

+0

對不起,我不明白。我用你的價值觀填充了我的實驗桌,結果與你的要求相符。您報告的問題與其他問題有關。發佈完整查詢:問題出在 –

+0

這是因爲查詢結果不是我相信的表。 – Neilski

-1

首先,使用

SELECT * INTO newTableName 

FROM yourRules 

的查詢保存到一個新表。

然後我們可以從新表中做另一個選擇。

SELECT * 
FROM newTableName t1 
WHERE b = (
    SELECT max(b) 
    FROM newTableName t2 
    WHERE t1.a = t2.a 
) 
0

別名s在子查詢中不可見。所以你必須在子查詢中再次編寫它。還可以使用group by代替where條款如下:

select s.* 
    from 
    (SELECT blah blah complex) s 
     where (s.a,s.b) in (select s2.a,max(s2.b) from (SELECT blah blah complex) group by s2.a); 

另外,創建查詢(SELECT blah blah complex)視圖爲即名爲V 並在主查詢中使用它,如下所示:

select * 
    from V 
    where (a,b) in (select v2.a,max(v2.b) from V as v2 group by v2.a); 

希望能幫助到你!

+0

它工作正常嗎? –

+0

感謝您的幫助Harshil。我不知道如何創建視圖(SQL noob),第一種方法太難以嘗試。我結束了在其他鏈接中的指導,並重寫了原始查詢以執行另一個JOIN(帶有子查詢),它執行max()。你的幫助被讚賞,因爲它讓我意識到,我的子查詢將永遠不會工作(文檔沒有透露,所以也許我在看錯文檔!)。 @Bill Karwin的回覆也引導我回到了其他問題,這些問題幫助我重寫了查詢。作爲本網站的新手,我不確定在哪裏頒發信用指導表示歡迎! :) – Neilski

+0

你可以把你的答案引向正確的方向。如果任何答案可以解決你的確切問題,你可以接受它作爲你的問題的答案。這兩件事都會對這個職位的新訪客有所幫助。 –