2012-03-23 139 views
0

我有一個MySQL表結構有點像這樣:如何根據兩列值選擇行?

type name value 
===================== 
1  item1 1 
1  item2 20 
2  item3 0 
3  item4 5 
3  item5 2 
3  item6 50 

我需要寫一個返回每種類型的最低值項目,由值排序的查詢。所以結果應該是:

type name value 
===================== 
2  item3 0 
1  item1 1 
3  item5 2 

我可以得到這個工作,但它現在看起來真的很難看。有沒有一個優雅的方式來做到這一點?

非常感謝!

+2

*「我能得到這個工作,」 * ...你能告訴我們的代碼,然後呢?沒關係,如果這是一場災難,但人們需要一個基準線:) – rdlowrey 2012-03-23 01:23:19

+0

是的,如果你顯示代碼 - 它更容易讓我們更好地看起來更好,所以我們不必嘗試重寫已經存在的代碼寫.. – Justin 2012-03-23 01:25:58

+0

@rdlowrey - 好吧,我當前的代碼選擇*所有*的行,然後在PHP中(所以在查詢後)我將所有行存儲在數組中,按「值」值排序,然後循環並找到具有最低「值」值的每種類型的行。我希望能夠在查詢中完成所有這些工作? – Nate 2012-03-23 01:30:49

回答

3

這就是所謂的「最偉大的正每組」查詢(即標籤上,所以你會發現很多類似的問題,下)。 (我知道你想要「每組最低」,但這是同樣的問題)。

通常情況下,你就能夠做到:

SELECT type, MIN(value) 
FROM mytable 
GROUP BY type 

但是這不會工作,如果你還想要name對應MIN(value)

要檢索每type最低value相應的行,你加入你的表本身type(在GROUP BY)變量,並與value(在MIN)變量的分類條件:

SELECT t1.type, t1.name, t1.value 
FROM mytable t1 
LEFT JOIN mytable t2 ON t1.type = t2.type AND t1.value > t2.value 
WHERE t2.value IS NULL 

注:

  • 我們LEFT JOINmytable自己,限制連接,使所有的type是相同的。這將生成一個表格,其中包含每種類型的值的每種組合。
  • 我們向LEFT JOIN添加條件來限制值的組合,例如t1.value > t2.value。所以,現在我們有各類型中值的每一個組合表,但T1的比我的大T2的
  • ,因爲這是一個LEFT JOIN,如果有一個t1.value對此有不小t2.value,相應t2列將爲NULL。但這是恰恰是這個類型的最小t1.value
  • 添加WHERE t2.value IS NULL條件以準確挑出這些行。
0

SELECT type, name, MIN(value) as value FROM table GROUP BY type

+0

這不一定會爲每個'type'選擇與'MIN(value)'對應的'name'。 – 2012-03-23 01:28:14

+0

對,這只是一個簡單的例子。 +1給你的答案 – Rob 2012-03-23 01:29:53

0

編輯3: 以下是按類型而不是名稱重新編制的查詢。

select type, name, min(value) from (select, type, name, value from Table order by value asc) group by type

這一個可以工作,但我不知道。見下文。男人,真是一團糟。

select type, name, min(value) from Table group by type order by value asc

編輯2: 對不起,我讀的問題是錯誤的。你可以忽略這個答案


我需要仔細檢查一下。不記得順序是否會使它選擇正確的類型。

select type, name, min(value) from Table group by name order by value asc

編輯: 我測試了我的數據集的一個類似的查詢和它似乎工作。但我不能肯定地說,因爲我剛剛通過分組後看到了這個順序。

所以替代將是這樣,那麼:

select type, name, min(value) from (select, type, name, value from Table order by value asc) group by name