2015-10-14 2 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 вместо Root на Child подряд?

Что я пытался сделать, так это то, что если столбец rootJargon не равен нулю, тогда выберите строку с идентификатором, указанным в столбце, который не равен нулю.

+0

Попробуйте добавить псевдоним таблицы для обеих ссылок «жаргонов» - возможно, он пытается сравнить «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 

Я, наверное, неправильно где-то в синтаксисе, но я думаю, вот идея ....