2009-11-23 33 views
3

表1具有列(id,a,b,c,group)。有幾行具有相同的組,但id始終是唯一的。我想SELECT組,a,b FROM Table1 WHERE組是不同的。但是,我希望返回的數據來自該組中具有最高ID的行。SQL選擇帶條件的區別

因此,如果我們有行

(id=10, a=6, b=40, c=3, group=14) 
(id=5, a=21, b=45, c=31, group=230) 
(id=4, a=42, b=65, c=2, group=230) 

我想回這2行:

[group=14, a=6,b=40] and 
[group=230, a=21,b=45] (because id=5 > id=4) 

有一個簡單的SELECT語句來做到這一點?

回答

1

您可以使用自加入或內部選擇。這裏是內選擇:

select `group`, a, b from Table1 AS T1 
    where id=(select max(id) from Table1 AS T2 where T1.`group` = T2.`group`) 

和自加入方法:

select T1.`group`, T2.a, T2.b from 
    (select max(id) as id,`group` from Table1 group by `group`) T1 
    join Table1 as T2 on T1.id=T2.id 
+0

我覺得自聯接會比相關子查詢快得多。 – 2009-11-23 16:37:31

+0

我完全同意,但它是顯示兩者的信息,另外我可以更快地輸入第一個。 ;) – 2009-11-23 16:44:06

+0

我想知道爲什麼這個答案像這樣downvoted .. – shylent 2009-11-23 16:59:09

3

嘗試:

select grp, a, b 
    from table1 where id in 
    (select max(id) from table1 group by grp) 
1

2選擇,你內心的選擇獲得:

SELECT MAX(id) FROM YourTable GROUP BY [GROUP] 

你的外選擇連接到這個表。

從邏輯上思考一下,內部選擇獲取您需要的數據的子集。 外部選擇內部聯接到此子集並可以獲得更多數據。

SELECT [group], a, b FROM YourTable INNER JOIN 
(SELECT MAX(id) FROM YourTable GROUP BY [GROUP]) t 
ON t.id = YourTable.id 
+0

爲什麼選擇投票? – JonH 2009-11-23 16:36:00

+0

Stackoverflow需要實現一個功能,以查看誰投了你,因爲沒有理由這樣! – JonH 2009-11-23 16:36:36

+0

我沒有,但是你需要MAX(id)列上的別名才能加入它 – 2009-11-23 16:37:53

1
SELECT mi.* 
FROM (
     SELECT DISTINCT grouper 
     FROM mytable 
     ) md 
JOIN mytable mi 
ON  mi.id = 
     (
     SELECT id 
     FROM mytable mo 
     WHERE mo.grouper = md.grouper 
     ORDER BY 
       id DESC 
     LIMIT 1 
     ) 

如果你的表是MyISAMid不是PRIMARY KEY,然後確保你在(grouper, id)有一個綜合指數。

如果你的表是InnoDBidPRIMARY KEY,然後grouper一個簡單的指標就足夠了(id,是一個PRIMARY KEY,將implictly包括在內)。

這將使用INDEX FOR GROUP-BY構建不同的石斑魚列表,並且對於每個石斑魚,它將使用索引訪問來查找最大值id

0

不知道如何在mysql中做到這一點。但是,下面的代碼將工作爲MSSQL ...

SELECT Y.* FROM 
(
    SELECT DISTINCT [group], MAX(id) ID 
    FROM Table1 
    GROUP BY [group] 
) X 
INNER JOIN Table1 Y ON X.ID=Table1.ID