基于值将查询与多个表连接

时间:2011-11-01 14:22:06

标签: php mysql

假设我有一个表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中去做。

感谢您的帮助。

2 个答案:

答案 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