2012-04-17 130 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