假设我有一个表posts
,如下所示:
| id | type | ref_id |
-----------+--------------+ ---------------
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 3 | 3 | 3 |
| 4 | 1 | 4 |
| 5 | 2 | 5 |
| 6 | 3 | 6 |
类型字段是与其他表连接,例如1 =博客,2 =评论,3 =照片,每个都有相应的字段,而ref_id是博客/评论/照片的ID。 / p>
我想要做的是显示所有最新的帖子(按ID DESC排序),同时根据类型的值加入所有其他表,但我希望尽可能使用一个查询。我的不好询问如下:
SELECT * FROM posts
LEFT JOIN blogs ON posts.ref_id = blogs.ID AND posts.type = 1
LEFT JOIN reviews ON posts.ref_id = reviews.ID AND posts.type = 2
LEFT JOIN photos ON posts.ref_id = photos.ID AND posts.type = 3
ORDER BY posts.id DESC
查询不会产生任何结果。另一种方法是循环SELECT * FROM posts查询并根据类型执行另一个查询,但如果可能的话,我想在1中去做。
感谢您的帮助。
答案 0 :(得分:0)
要查看查询为什么不返回任何内容,请考虑将“AND posts.type =”从JOIN移动到WHERE子句。它将是:
select * from posts ... where type=1 and type=2 and type=3
显然,它不会返回任何结果。我知道这不是你问题的答案,但我会考虑你的表定义中的一个小改动:
(表名:字段)
posts: id
blogs: id, post_id
reviews: id, post_id
photos: id, post_id
在这种情况下,您将能够构建更简单和更传统的查询:
select * from posts
left join blogs on blogs.post_id = posts.id
left join reviews on reviews.post_id = posts.id
left join photos on photos.post_id = posts.id
答案 1 :(得分:0)
我猜你想要这样的东西:
( SELECT posts.*, blogs.*
FROM posts
JOIN blogs
ON posts.ref_id = blogs.ID
AND posts.type = 1
UNION ALL
SELECT posts.*, reviews.*
FROM posts
JOIN reviews
ON posts.ref_id = reviews.ID
AND posts.type = 2
UNION ALL
SELECT posts.*, photos.*
FROM posts
JOIN photos
ON posts.ref_id = photos.ID
AND posts.type = 3
)
ORDER BY posts.id DESC