Попытка использовать case для выполнения двух подзапросов (внутреннее соединение) - PullRequest
2 голосов
/ 28 марта 2019

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

Я пытался, если, но я начал читать документацию, но разве это не свинья

Это мой запрос, надеюсь, кто-нибудь может мне помочь или показать мне правильный путь.

SELECT * from suggestions INNER JOIN staff on suggestions.id_staff = staff.id_staff 
    (CASE
        WHEN suggestions(suggestions.for_their_area = '1')
            THEN (
                INNER JOIN areas on staff.id_area = areas.id_area
            )
        ELSE (
            INNER JOIN areas on suggestions.for_their_area = areas.id_area
        )
) WHERE suggestions.accepted = '1'

Я ожидаю выполнить внутреннее объединение в 3 таблицы, если мое значение из одного поля равно 1, выполнить первое, а если это же поле равно 0, выполнить второе

Ответы [ 2 ]

1 голос
/ 28 марта 2019

Лучший способ - всегда объединять обе таблицы, а затем использовать Case, чтобы решить, какую из них использовать.

SELECT s.*,
CASE WHEN s.for_their_area='1' THEN a1.area_field ELSE a2.area_field END area_field
FROM suggestions s
INNER JOIN staff st ON s.id_staff=st.id_staff
LEFT JOIN areas a1 on st.id_area=a1.id_area
LEFT JOIN areas a2 on s.for_their_area=a2.id_area
WHERE s.accepted='1'

Или вы можете сделать условное объединение:

SELECT s.*,
a.area_field 
FROM suggestions s
INNER JOIN staff st ON s.id_staff=st.id_staff
INNER JOIN areas a ON ((s.for_their_area='1' and st.id_area=a.id_area)
OR (s.for_their_area != '1' and s.for_their_area=a.id_area))
WHERE s.accepted='1'
0 голосов
/ 28 марта 2019

Переместите условия в ON предложения и используйте LEFT JOIN:

SELECT s.*, st.*,
       COALESCE(a1.?, a2.?)
FROM suggestions s INNER JOIN
     staff st
     ON s.id_staff = st.id_staff LEFT JOIN
     areas a1
     ON st.id_area = a1.id_area AND
        s.for_their_area = '1' LEFT JOIN
     areas a2
     ON s.for_their_area = a2.id_area AND
        s.for_their_area <> '1'
WHERE s.accepted = '1';

Для столбцов, которые вы хотите выбрать из areas, используйте COALESCE().

Вы также можете сформулировать эту логику, используя OR, но это обычно убийство производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...