MySQL JOIN - 复杂的Select语句

时间:2012-04-17 21:38:35

标签: mysql join left-join

我有3张桌子。一个用户,一个用于帖子,一个用于链接其他两个表的连接表。

以下是连接表中的一些示例数据。

| 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)选择时间戳为4-17-2012的用户的所有帖子

2)如果该用户的联接表中没有帖子条目,也请选择这些帖子。

所以... 对于user_id = 1,将选择post 1,但不会选择post 2,因为post 2不是4-17-2012 对于user_id = 2,将选择两个帖子,帖子1,因为没有user_id = 2和post_id = 1的条目,而帖子2因为它是4-17-2012 对于user_id = 3,不会返回post 1,但是post 2会返回,因为user_id = 3和post_id = 2没有条目。

这是我一直在尝试的一个例子:

SELECT * FROM posts AS p  LEFT JOIN posts_users as pu ON(p.post_id = pu.post_id)  WHERE((pu.user_id = $ user_id AND pu.timestamp = 4-17-2012)或(pu.post_id IS NULL)

如果帖子中有post_id = 3行,那么所有posts_users列都会为NULL,因为LEFT JOIN会帮助满足#2。但是如果有任何人使用post_id = 3的posts_users条目,那么就没有NULL。在MySQL中有没有办法让我们有#2的逻辑?

我在一个已经用PHP编写的框架中完成了这一切,并且这种方式使我很难处理使用PHP来过滤返回的结果。相信我。有没有办法让我使用SQL语句来实现这一点,或者在获得其他查询的结果后,我是否必须尝试在PHP中进行解决?

感谢。

1 个答案:

答案 0 :(得分:1)

这会有用吗?

从user.id = posts_users.user_id上的用户左外连接posts_users中选择*在posts.id = posts_users.post_id上留下外连接帖子,其中timestamp ='4-17-2012'或timestamp = NULL