2015-08-03 3 views
0

У меня есть запрос с оператором CASE, который определяет переменную object_name, эта переменная получена либо из таблицы x_ambitions, либо из таблицы x_trybes. Запросы, приведенные ниже, были объединены, поэтому я мог бы упростить его, просто выполнив один SQL-запрос.MySQL CASE LEFT JOINS возвращает NULL

Я разделил инструкцию SELECT на два, чтобы у вас было лучшее понимание. Два запроса ниже. Работайте и вытащите правильное имя_объекта из базы данных.

Проблема, с которой я сталкиваюсь, когда я совмещаю два запроса, заключается в том, что случаи 'new_join_ambition','new_created_ambition','new_liked_ambition' имя_объекта возвращает NULL в LEFT JOIN.

В комбинированном запросе, если я приведу чехлы: 'new_join_ambition','new_created_ambition','new_liked_ambition' над случаями 'new_join_trybe','new_created_trybe','new_liked_trybe'. Происходит обратное. Строки trybe возвращают NULL.

Два SQL запросов:

A: (получить объект А)

SELECT 
    s.id, 
    s.object_id, 
    s.type, 
    s.postee_id, 
    s.user_id, 
    s.text, 
    s.registered, 
    CONCAT(u.x_first_name,' ',u.x_last_name) AS postee_name, 
    ui.image_id AS postee_image_id, 
    CASE s.type 
     WHEN 'new_join_ambition' 
      OR 'new_created_ambition' 
      OR 'new_liked_ambition'   
      THEN a.name 
      ELSE 'a' 
    END AS object_name 
FROM 
    x_share s 
LEFT JOIN 
    x_user u ON u.id = s.postee_id 
LEFT JOIN 
    x_user_images ui ON ui.user_id = s.postee_id 
LEFT JOIN 
    x_ambitions a ON s.type IN ('new_join_ambition', 'new_created_ambition', 'new_liked_ambition') AND s.object_id = a.id 
LEFT JOIN 
    x_ambition_invites ai ON s.type IN ('new_join_ambition') AND s.object_id = ai.ambition_id AND s.postee_id = ai.to 
LEFT JOIN 
    x_ambition_likes al ON s.type IN ('new_liked_ambition') AND s.object_id = al.ambition_id AND s.postee_id = al.profile_id 
LEFT JOIN 
    x_ambition_owner aoo ON s.type IN ('new_created_ambition') AND s.object_id = aoo.ambition_id 
WHERE 
    s.user_id = '%s' 
ORDER BY 
    s.registered DESC 

B: (Извлечь объект B)

SELECT 
    s.id, 
    s.object_id, 
    s.type, 
    s.postee_id, 
    s.user_id, 
    s.text, 
    s.registered, 
    CONCAT(u.x_first_name,' ',u.x_last_name) AS postee_name, 
    ui.image_id AS postee_image_id, 
    CASE s.type 
     WHEN 'new_join_trybe' 
      OR 'new_created_trybe' 
      OR 'new_liked_trybe' 
      THEN t.name 
      ELSE 'a' 
    END AS object_name 
FROM 
    x_share s 
LEFT JOIN 
    x_user u ON u.id = s.postee_id 
LEFT JOIN 
    x_user_images ui ON ui.user_id = s.postee_id 
LEFT JOIN 
    x_trybes t ON s.type IN ('new_join_trybe', 'new_created_trybe', 'new_liked_trybe') AND s.object_id = t.id 
LEFT JOIN 
    x_trybe_invites ti ON s.type IN ('new_join_trybe') AND s.object_id = ti.trybe_id AND s.postee_id = ti.to 
LEFT JOIN 
    x_trybes_likes tl ON s.type IN ('new_liked_trybe') AND s.object_id = tl.trybe_id AND s.postee_id = tl.profile_id 
LEFT JOIN 
    x_trybe_owner too ON s.type IN ('new_created_trybe') AND s.object_id = too.trybe_id 
WHERE 
    s.user_id = '%s' 
ORDER BY 
    s.registered DESC 

Я побежал как запросы и имеют записанные изображения результатов обоих запросов.

Set A:

Set A Result

Набор B:

Set B Result

Как я могу объединить два без object_name возвращающей NULL? Если у вас есть какие-либо вопросы, пожалуйста, используйте комментарии, и я отвечу без колебаний.

Заранее спасибо

+0

вы могли бы сделать скрипку. и разместить точный вывод – amdixon

ответ

2

я не знаю об остальной части вашего запроса, но ваши case утверждения неверно. У вас есть:

(CASE s.type 
      WHEN 'new_join_ambition' OR 'new_created_ambition' OR 'new_liked_ambition' 
      THEN a.name 
      ELSE 'a' 
END) AS object_name 

В OR s в конечном итоге лечения значения как числа, так что это эквивалентно WHEN 0 THEN . . ..

То, что вы хотите, это форма case:

(CASE WHEN s.type IN ('new_join_ambition', 'new_created_ambition', 'new_liked_ambition') 
     THEN a.name 
     ELSE 'a' 
END) AS object_name 
+0

Это работает! Спасибо за это. Но одна вещь, которую я видел, - это повторяющийся 'WHEN s.type IN ('new_join_trybe', 'new_created_trybe', 'new_liked_trybe') THEN t.name'. Я просто придирчиваюсь, но спасибо! :) – cwiggo

Смежные вопросы