2012-04-17 105 views
0

我有3個表。一個用於用戶,一個用於帖子,另一個用於連接另外兩個表的連接表。MySQL的JOIN - 複雜Select語句

下面是連接表的一些樣本數據。

| id | user_id | post_id | timestamp | 
|----|---------|---------|-----------| 
| 1 | 1 | 1 | 4-17-2012 | 
| 2 | 1 | 2 | 4-16-2012 | 
| 4 | 2 | 2 | 4-17-2012 | 
| 5 | 3 | 1 | 4-16-2012 | 
|____|_________|_________|___________| 

我想寫一個SELECT查詢,將做到以下幾點:

1)選擇一個用戶的所有職位與2012年4月17日

時間戳

2)如果該用戶的連接表中沒有帖子條目,請選擇這些帖子。

所以...... 對於USER_ID = 1,後期1會被選中,但沒有發佈2,因爲後2不是2012年4月17日 對於USER_ID = 2,這兩個職位會被選中,後因1有對USER_ID = 2和POST_ID = 1的條目,並張貼2,因爲它是2012年4月17日 對於USER_ID = 3,1後不予退還,但後2會是這樣,因爲沒有爲USER_ID沒有條目= 3,POST_ID = 2

這裏是什麼,我一直想一個例子:

SELECT * FROM職位爲p LEFT JOIN posts_users爲濮上(p.post_id = pu.post_id) WHERE((pu.user_id = $ USER_ID和pu.timestamp = 2012年4月17日)OR(pu.post_id IS NULL)

如果有一個POST_ID = 3行中的職位,那就有NULL所有posts_users列,因爲LEFT JOIN,這有助於滿足#2。但是如果有任何人使用post_id = 3的posts_users條目,那麼將不會有NULL。 MySQL中有沒有辦法讓我們可以擁有#2的邏輯?

我做的這一切都在一個已經在PHP寫出來的框架,並在某種程度上這將使它很難讓我必須處理使用PHP來過濾返回的結果。請相信我。有沒有辦法對我來說,使用一個SQL語句來做到這一點,還是我去嘗試,並在PHP中的解決方法後,我得到一些其他查詢的結果?

謝謝。

+0

帖子展望進一步,它看起來像我可以使用NOT EXISTS?我從來沒有使用過這個,我怎麼會在這種情況下使用它?再次感謝。 – MattDiamant 2012-04-17 21:54:53

回答

1

將這項工作?

SELECT * FROM用戶左外連接posts_users上user.id = posts_users.user_id左外連接上posts.id = posts_users.post_id其中timestamp = '2012年4月17日' 或時間戳= NULL

+0

確切的聲明不起作用(例如,它沒有user_id),但它使我找到答案,所以我會給你複選標記。我使用的聲明(基本上)是以下(這些實際上不是表或列的名稱,我只是簡化它們)。這太可怕了。願上帝憐憫我的靈魂。 'SELECT posts。* FROM users LEFT JOIN posts on(1) LEFT JOIN posts_users ON((posts.id = posts_users.post_id)AND(users.id = posts_users.user_id)) WHERE(users.id = $ user_id)AND((posts_users.timestamp ='4-17-2012')或(posts_users.timestamp IS NULL))' – MattDiamant 2012-04-18 03:03:57