2013-10-10 122 views
-5

編輯:根據@MostyMostacho在下面的註釋中的說明,這不能用普通SQL來完成。我會保持打開的問題,以防萬一它對其他人有用。SQL根據給定字段僅選擇第一個匹配項

我有這個表:

+---+---+ 
| a | b | 
+---+---+ 
| 1 | J | 
+---+---+ 
| 4 | A | 
+---+---+ 
| 1 | A | 
+---+---+ 
| 6 | A | 
+---+---+ 
| 7 | A | 
+---+---+ 
| 3 | A | 
+---+---+ 
| 5 | A | 
+---+---+ 
| 3 | P | 
+---+---+ 
| 4 | P | 
+---+---+ 
| 1 | P | 
+---+---+ 
| 5 | P | 
+---+---+ 
| 6 | P | 
+---+---+ 
| 7 | P | 
+---+---+ 

而且我想這樣的結果:

+---+---+ 
| a | b | 
+---+---+ 
| 1 | J | 
+---+---+ 
| 4 | A | 
+---+---+ 
| 6 | A | 
+---+---+ 
| 7 | A | 
+---+---+ 
| 3 | A | 
+---+---+ 
| 5 | A | 
+---+---+ 

我想保持的a第一次出現,並丟棄後續行。

我應該執行哪些查詢以達到目的?我的SQL技能正在生鏽......

+1

在這方面應該定義「第一」的ASC值條件。除非應用了某種類型的ORDER BY,否則不保證從MySQL返回數據集時的行排序。 –

+0

正如我在第二個註釋中所寫的那樣,表格實際上是有序的。 – Carlos

+0

訂單是否受到排列B的排列位置的限制? –

回答

0

沒有特定的時間戳或以其他方式單調遞增的id列,沒有辦法查詢表中的行插入的順序;數據庫引擎可以自由地在它爲所欲爲任意順序,這可能不是在該行中去的順序返回行。

因此,你有什麼建議實際上是與表架構最RDBMS不可能你提供了。


是你下面的表有,但是:

 
+-------+-------+-------+ 
| id | A | B | 
+-------+-------+-------+ 
| 1 | 1 | z | 
| 2 | 1 | y | 
| 3 | 1 | x | 
| 4 | 2 | y | 
| 5 | 2 | x | 
| 6 | 3 | x | 
+-------+-------+-------+ 

你可以這樣做:

SELECT a.A, a.B 
FROM Table1 a 
INNER JOIN (
    SELECT MIN(id) id 
    FROM Table1 
    GROUP BY A 
) b ON b.id = a.id 

SQL Fiddle demo

0
SELECT a.A, a.B 
FROM (select @rownum:[email protected]+1 as id, a, b FROM table, (SELECT @rownum:=0) r ) a 
INNER JOIN (
    SELECT MIN(id) id 
    FROM (select @rownum:[email protected]+1 as id, a, b FROM table, (SELECT @rownum:=0) r ) 
    GROUP BY A 
) b ON b.id = a.id 
+0

不會。 –

+0

@MostyMostacho,這真的是一個非法的分組,在MySQL中,返回第一項 – AdrianBR

+1

你可以請張貼官方文檔鏈接說明? –

1

試試這個:

SELECT T1.* 
FROM myTable T1 
WHERE NOT EXISTS(
    SELECT 'NEXT' 
    FROM myTable T2 
    WHERE T2.a = T1.a 
    AND T2.b > T1.a 
) 

NOT EXISTS子查詢得到的只是最後,我想你的順序是由B列

相關問題