2014-11-20 52 views
0

給定一個表,如以下稱爲form_letters:選擇表的每一行,除非該ID不是最大值一個給定的外鍵

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

如何選擇每行中,除了那些對於給定的respondent_id,它沒有最大的id值。

實施例的結果:

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

'? – 2014-11-20 18:39:22

+0

有關問題的更多解釋 – ashkufaraz 2014-11-20 18:40:53

+0

我想包含具有給定respondent_id的最高id的行,並排除沒有最大id(對於給定respondent_id當然)的行。 – 2014-11-20 18:42:57

回答

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

+0

我認爲「不存在」應該是「存在」。 – 2014-11-20 19:08:19

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

除了不具有最大id`或具有一個最大ID的那些
相關問題