加入3个sql表并进行嵌套查询

时间:2015-10-19 19:01:52

标签: mysql sql postgresql

所以我有3个名为commentsusersposts的表。 我想得到

  1. 评论中的“得分”
  2. 通过使用c.user_id = u.id
  3. 在评论和用户之间进行左联接,为用户提供“用户信誉”
  4. 通过在c.post_id = p.id上的评论和帖子之间进行左联接,从帖子表中获取“标签”。

    但是这里有一个技巧,标签应该基于帖子的类型(p.post_type_id)。

    因此,如果id = 1那么这意味着我们将“问题”作为帖子并简单地检索标签

    否则,如果id = 2那么这意味着我们有一个答案并且要获得标签我们必须从posts表中查看其parent_id。

  5. 我尝试使用WHERE,CASE,嵌套IF和嵌套SELECT,但都抛出了语法错误

    最后,我尝试执行以下操作,但结果为空

    SELECT c.score, 
        COALESCE (u.reputation) reputation,
        COALESCE (p.tags) tags
    FROM comments c 
        LEFT JOIN users u 
            ON c.user_id = u.id
        LEFT JOIN posts p 
            ON (c.post_id = p.id AND p.post_type_id = 1) OR (c.post_id = p.id AND p.post_type_id = 2 )
                 WHERE (p.id = p.parent_id)
    

    那么如何根据这两种类型制作标签呢?

1 个答案:

答案 0 :(得分:1)

快速猜测:

http://sqlfiddle.com/#!9/a1cc3/1

SELECT c.score, 
    u.reputation reputation,
    IF(p.post_type_id=1,p.tags,
                 IF(p.post_type_id=2,parents.tags,'UNKNOWN POST TYPE')
       ) tags
FROM comments c 
    LEFT JOIN users u 
        ON c.user_id = u.id
    LEFT JOIN posts p 
        ON c.post_id = p.id  
    LEFT JOIN posts parents 
       ON parents.id = p.parent_id

更新以下是Postgres变体:

http://sqlfiddle.com/#!15/a1cc3/2

SELECT c.score, 
    u.reputation,
    CASE p.post_type_id 
         WHEN 1 THEN p.tags
         WHEN 2 THEN parents.tags
         ELSE 'UNKNOWN POST TYPE'
    END tags
FROM comments c 
LEFT JOIN users u 
   ON c.user_id = u.id
LEFT JOIN posts p 
   ON c.post_id = p.id  
LEFT JOIN posts parents 
   ON parents.id = p.parent_id