2015-05-10 38 views
0

这是一些测试数据。选择一些不同的列

+----+------+-------+---------+---------+ 
| id | type | param | enabled | account | 
+----+------+-------+---------+---------+ 
| 1 | test |  a |  1 | null | 
| 2 | asdf |  b |  1 | null | 
| 3 | test |  c |  1 |  34 | 
| 4 | test |  d |  0 |  34 | 
| 5 | asdf |  e |  1 | null | 
+----+------+-------+---------+---------+ 

我想选择最新的行,其中“类型”和“帐户”是唯一的。

例如,对于测试表,我想要的结果:

+----+------+-------+---------+---------+ 
| id | type | param | enabled | account | 
+----+------+-------+---------+---------+ 
| 1 | test |  a |  1 | null | 
| 4 | test |  d |  0 |  34 | 
| 5 | asdf |  e |  1 | null | 
+----+------+-------+---------+---------+ 

我试着按组的变化:

SELECT * FROM test GROUP BY type, account 

出于某种原因,让我这样的:

+----+------+-------+---------+---------+ 
| id | type | param | enabled | account | 
+----+------+-------+---------+---------+ 
| 1 | test |  a |  1 | null | 
| 4 | test |  d |  1 |  34 | <- note that enabled is taking on an incorrect value. 
| 5 | asdf |  e |  1 | null | 
+----+------+-------+---------+---------+ 

什么是正确的方法来做到这一点?

+0

您试过'SELECT DISTINCT * FROM test'吗? –

+1

DISTINCT适用于所有选定的列。所以在这个例子中,它会选择'id','type','param','enabled'和'account'都是唯一的。我只想'类型'和'帐户'是唯一的。 – ieatpizza

回答

-1

如果您的查询是给你正确的ID,你应该尝试把它变成一个子查询:

SELECT * FROM test WHERE id IN (SELECT id FROM test GROUP BY type, account) 
+0

这有效。谢谢! – ieatpizza

+0

这不适合我。返回所有行。见下面的解决方案 – DCR

2

假设“最新行”是指具有最大id,那么有几种方法。使用in的方法是:

SELECT t.* 
FROM test t 
WHERE t.id IN (SELECT MAX(id) FROM test t2 GROUP BY type, account)