2009-11-23 83 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