2011-04-06 44 views
0

假設我有一個MySQL連接,它給了我一堆包含以下列的行:PERSON_ID,ENTRY_ID,DATEMySQL:獲取一列中沒有與第二列上的條件匹配的行的所有值

每個人可以有多個條目,但一個條目不能屬於多個人。我想要檢索的是上個月沒有發佈條目的所有人員的列表 - (在NOW())的30天內沒有DATE行的所有PERSON_ID。我可以在單個查詢中得到結果嗎?

我現在的加盟基本上是:

SELECT P.ID,P.NAME,P.EMAIL,E.ID,E.DATE由人P,項E WHERE P.ID = E.PERSON_ID。

這給出了所有條目的列表,並加入了關於發佈每個條目的人的附加信息。條目表是一個很大的表,因此可伸縮性有點重要。

+3

這將有助於如果你包含了你的查詢 - 這可能會變成一個左連接,並且where條件中的「其他」表中的某些情況爲空(如果連接成功則無法成立) – 2011-04-06 08:18:50

回答

0

你可能需要某種形式的左側空的加入...但是,我有點困惑。對於每個可能的人,是否還有另一張只有一行的表格?還是你的意思是你想要一個在你的示例表格中至少有一行的每個人的列表,但是如果最後一個月沒有條目?

假設後者(TBH雖然前者似乎更容易):

select distinct(t1.person_id) from mytable as t1 
left join mytable as t2 on t1.person_id = t2.person_id and 
t2.`date` > date_sub(now(), interval 30 day) 
where t2.person_id is null 
; 

這基本上是說「給我不同的人ID的列表,你不能加入到這個人的ID,在過去提前30天」

(未經測試的BTW)

...作爲另一個評論,你可能會做這樣的事情:

select distinct(t1.person_id) from mytable as t1 where t1.person_id not in 
    (select person_id from mytable where `date` > date_sub(now(), interval 30 day) 
); 

這很好,只要你的數據集是小,將留小,但規模會非常糟糕一大批行...

+0

左空連接完成了這個技巧! – NChase 2011-04-06 19:17:40

0

我會建議外部連接條目表的人表,並由PERSON_ID組。

只要沒有匹配的行,這將導致日期列中的所有值爲NULL,但仍將顯示PERSON_ID

之後,剩下的就是檢查日期列是否爲NULL

  • 如果包括你的表結構,我將能夠添加一個MySQL的語句可以解釋好了很多
0

假設你的查詢會像

Select tablea.person_id, entry_id, date from tablea 
left join 
(select * from tableb tableb.date between subdate(now(),30) and adddate(now(),30) as temptable on tablea.person_id=temptable.person_id where temptable.date is null 
相關問題