仅选择多次出现的一个条目

时间:2014-01-09 10:29:56

标签: mysql sql select group-by greatest-n-per-group

假设我有一个看起来像这样的表:

id fk value
------------
1  1  'lorem'
2  1  'ipsum'
3  1  'dolor'
4  2  'sit'
5  2  'amet'
6  3  'consetetur'
7  3  'sadipscing' 

每个 fk 可以多次出现,而对于每个 fk ,我想选择最后一行(或更精确地分别具有最高ID的行) - 像这样:

id fk value
------------
3  1  'dolor'
5  2  'amet'
7  3  'sadipscing' 

我认为我可以像这样使用关键字DISTINCT

SELECT DISTINCT id, fk, value 
FROM table

但我不确定哪一行DISTINCT将返回,它必须是最后一行。 有什么像(

SELECT id, fk, value 
FROM table 
WHERE MAX(id) 
FOREACH DISTINCT(fk)

我希望我在这里有任何意义:) 谢谢你的时间

4 个答案:

答案 0 :(得分:9)

SELECT * 
  FROM table  
  WHERE id IN (SELECT MAX(id) FROM table GROUP BY fk)

答案 1 :(得分:2)

试试这个:

SELECT a.id, a.fk, a.value
FROM tableA a 
INNER JOIN (SELECT MAX(a.id) id, a.fk FROM tableA a GROUP BY a.fk
           ) AS b ON a.fk = b.fk AND a.id = b.id;

SELECT a.id, a.fk, a.value
FROM (SELECT a.id, a.fk, a.value FROM tableA a ORDER BY a.fk, a.id DESC) AS a 
GROUP BY a.fk;

答案 2 :(得分:1)

试试这个:

SELECT t.* FROM
table1 t
JOIN (
  SELECT MAX(id) as id
  FROM table1
  GROUP BY fk
) t1
ON t.id = t1.id

内部查询将使用MAX()为每个fk提供最高ID。然后我们将这个内部表与你的主表连接起来。

答案 3 :(得分:0)

您也可以

SELECT id, fk, value FROM table GROUP BY fk HAVING id = MAX(id)

我这里没有mysql,但它适用于Sybase ASE