2015-10-19 145 views
1

所以我有3個表,分別叫做comments,usersposts。 我想加入3個sql表並進行嵌套查詢

  1. 從評論的「分數」
  2. 「用戶信譽」爲做左用戶評論和用戶之間的連接與c.user_id = u.id
  3. 得到通過在c.post_id = p.id上發表評論和帖子之間的左連接,從帖子表中「標記」。

    但是這裏有一個技巧,標籤應該基於帖子的類型(p.post_type_id)。

    因此,如果ID = 1,那麼這意味着我們有「問題」的帖子,簡單地檢索標籤

    否則,如果ID = 2那麼這意味着我們有一個答案,讓我們有標籤從posts表中查看它的parent_id。

我試圖使用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

你使用的是Postgres或MySQL?請適當地標記你的問題。 –

回答

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 

UPDATE這裏是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 
+0

這裏我得到了:錯誤:功能如果(布爾,文本,未知)不存在 線4:如果(p.post_type_id = 2,parents.tags,'未知P ... ^ 提示:沒有功能匹配給定的名稱和參數類型您可能需要添加明確的類型轉換 **********錯誤********** 錯誤:function if(boolean,text,unknown )不存在 SQL狀態:42883 提示:沒有函數會與給定的名稱和參數類型匹配您可能需要添加明確的類型轉換 字符:96 – akalthubaity

+0

hmmm ...檢查查詢中的最後一行有錯字' ON'錯過... – Alex

+0

@akalthubaity **函數不存在**可能你沒有mysql我nstalled :-)你使用什麼確切的服務器:** MSSQL? MySQL的? Postgres SQL?** – Alex