2015-10-14 147 views
0
SELECT jargons.jargon as jargon, 
     jargons.description as description, 
     jargons.example as example, 
     IF(jargons.rootJargon != 0, (SELECT jargon FROM jargons WHERE id = jargons.rootJargon), NULL) as rootJargonName 
FROM jargons 
LEFT JOIN users ON users.id = jargons.addedBy 
ORDER BY jargons.id DESC 

我有行話表內的兩行:選擇內部IF語句

"id" "jargon" "description" "example" "rootJargonName" "rootJargon" 
"2" "Child"   "jd"   "1"    NULL    1 
"1" Root"   "sad"   "1"    NULL    0 

爲什麼會出現rootJargonName回報null而不是RootChild行?

我想要做的是,如果rootJargon列不等於零,然後選擇列中指定的id不等於零的行。

+0

嘗試增加一個表的別名,這兩個'jargons'引用 - 它可能試圖比較來自同一個表引用的'id'和'rootJargon'。 – Siyual

回答

3

很可能你看到一個表的別名問題,但是你可以重寫這個使用LEFT JOIN

SELECT  J.jargon as jargon, 
      J.description as description, 
      J.example as example, 
      R.jargon As rootJargonName 
FROM  jargons as J 
LEFT JOIN users as U ON U.id = J.addedBy 
LEFT JOIN jargons as R ON J.rootJargon = R.ID 
ORDER BY J.id DESC 

如果你想保持IF()功能,可以使用下面的,但是我建議使用LEFT JOIN

SELECT  J.jargon as jargon, 
      J.description as description, 
      J.example as example, 
      IF(J.rootJargon != 0, (SELECT jargon FROM jargons as R WHERE R.id = J.rootJargon), NULL) as rootJargonName 
FROM  jargons as J 
LEFT JOIN users as U ON U.id = J.addedBy 
ORDER BY J.id DESC 
+0

好吧,這個工程。 IF語句沒有辦法做到這一點嗎?就是想。 –

+0

@AliDemirci您可以使用IF()函數重寫它,但這會導致返回的每個記錄的子查詢。通常使用'LEFT OUTER JOIN'來做這個更好,但我會更新答案以包含'IF()'修復。 – Siyual

+0

現在,這是完美的答案。謝謝! –

0

你爲什麼不嘗試

的情況等:

SELECT jargons.jargon as jargon, 
    jargons.description as description, 
    jargons.example as example, 
    CASE 
     WHEN (jargons.rootJargon == 0) THEN NULL 
     WHEN (jargons.rootJargon != 0) THEN 
     (SELECT jargon FROM jargons WHERE id = jargons.rootJargon) 
    END) AS 'rootJargonName' 
FROM jargons 
LEFT JOIN users ON users.id = jargons.addedBy 
ORDER BY jargons.id DESC 

我可能在某個語法錯誤的,但我認爲是的想法....