选择表的每一行,除非id不是给定外键的最大值

时间:2014-11-20 18:34:23

标签: mysql sql

给出一个如下表格,称为form_letters:

+---------------+----+
| respondent_id | id |
+---------------+----+
|             3 |  1 |
|             7 |  2 |
|             7 |  3 |
+---------------+----+

如何选择除了没有给定respondent_id的最大id值的行之外的每一行。

示例结果:

+---------------+----+
| respondent_id | id |
+---------------+----+
|             3 |  1 |
|             7 |  3 |
+---------------+----+

3 个答案:

答案 0 :(得分:2)

这样的事情应该有用;

SELECT respondent_id, MAX(id) as id FROM form_letters
group by respondent_id

MySQL小提琴:

http://sqlfiddle.com/#!2/5c4dc0/2

答案 1 :(得分:1)

有很多方法可以做到这一点。 group by使用max(),或使用not exits并使用left join

这里使用左连接,这在索引列

的性能方面更好
select 
f1.*
from form_letters f1
left join form_letters f2 on f1.respondent_id = f2.respondent_id
and f1.id < f2.id
where f2.respondent_id is null 

使用not exits

select f1.*
from form_letters f1
where not exists
(
  select 1 from form_letters f2
  where f1.respondent_id = f2.respondent_id
  and f1.id < f2.id
)

<强> Demo

答案 2 :(得分:0)

这是我将如何做到的。获取子查询中的最大ID,然后将其连接回原始表。接下来,限制ID不等于最大ID的记录。

编辑:与此相反。限制ID = MaxID的记录。代码更改如下。

Select    FL.Respondent_ID, FL.ID, A.Max_ID
From      Form_Letters FL
left join (
   select    Respondent_ID, Max(ID) as Max_ID
   from      Form_Letters
   group by  Respondent_ID) A
on  FL.Respondent_ID = A.Respondent_ID
where FL.ID = A.Max_ID