Левая присоединительная база на CASE - PullRequest
0 голосов
/ 24 января 2019

Я хочу сделать левое соединение в MySQL. Объединение основано на условии. Например, если значение равно 328, use Left Join <table A> ELSE , используйте Left Join <table B>

Ниже приведены запросы:

SELECT * FROM applications app
CASE 
WHEN 
    app.application_type = 328 
THEN
    LEFT JOIN application_individu ai 
    ON app.id = ai.application_id 
ELSE
    LEFT JOIN application_org ao 
    ON app.id = ao.application_id 
END
WHERE app.id=11

Я получил сообщение об ошибке на phpmyadmin

#1064 - You have an error in your SQL syntax; 
check the manual that   corresponds to your MariaDB server version for the right syntax to use near 
'(CASE WHEN app.application_type = 328 THEN
 LEFT JOIN application_individu a' at line 5

1. Можем ли мы использовать CASE для соединения?

2. Если возможно, как это сделать правильно?

Обновление данных

Ниже приведены примеры данных.

приложения

id  application_type  app_reference  applicant_type  status created_date
1   330               ZAK00001       328             1      2019-01-16 16:45:14
2   330               ZAK00002       328             1      2019-01-17 12:31:14
3   330               ZAK00003       329             2      2019-01-17 14:31:40

application_individu

id   application_id  name  age  gender  contactNo  ic
1    1               Ali   30   Male    1234       12345678
2    2               Chan  45   Male    1234       54321

application_org

id   application_id  companyName  companyRegNo  picName  picContactNo  companyEmail
1    3               My StartUp   x-123Y        Raja     01035562      example@mystartup.com

параметры

id  parameterValue  detail
1   328             Personal              
2   329             Company
3   1               Complete
4   2               Pending

Это мой обновленный запрос без использования CASE.

SELECT * FROM applications app
LEFT JOIN application_individu ai ON app.id=ai.application_id
LEFT JOIN application_org ao ON app.id=ao.application_id
LEFT JOIN parameters param ON app.applicant_type=param.main_id
LEFT JOIN parameters param2 ON app.status=param2.main_id
LEFT JOIN parameters param3 ON app.applicant_type=param3.main_id
LEFT JOIN parameters param4 ON app.status=param4.main_id

Есть ли способ проверить, является ли приложение Personal или Company, чтобы я не повторял параметры при соединении.

Ответы [ 4 ]

0 голосов
/ 25 января 2019

Чтобы условно объединить таблицы, просто означает внешнее объединение их в SQL. Таким образом, у вас есть либо одна информация, либо другая в строке результатов. Вы получите запрос, подобный тому, который вы добавили к вашему запросу.

По моему мнению, объединенная таблица параметров не имеет смысла. Вместо этого имейте таблицу состояния и таблицу Applicant-Type, чтобы вы могли применять надлежащие внешние ключи и знать, какой из них.

Запрос будет выглядеть примерно так:

SELECT
  app.app_reference, created_date, s.status_text, apt.type_text,
  ai.name, ai.age,
  ao.companyName, ao.companyRegNo
FROM applications app
INNER JOIN status s ON s.id = app.status_id
INNER JOIN applicant_type apt on apt.id = app.applicant_type_id
LEFT JOIN application_individu ai ON app.id = ai.application_id
LEFT JOIN application_org ao ON app.id = ao.application_id;
0 голосов
/ 24 января 2019

Вы можете попробовать ниже - используя левое соединение с применением условия в ON cluase

    SELECT * FROM applications app
    left join application_individu ai ON app.id = ai.application_id
    and app.application_type = 328 
    LEFT JOIN application_org ao ON app.id = ao.application_id 
    WHERE app.id=11
0 голосов
/ 24 января 2019

Вы должны поместить логику в предложение ON. И не забудьте использовать COALESCE() в SELECT:

SELECT a.*,
       COALESCE(ai.name, ao.name) as name
FROM applications a LEFT JOIN
     application_individu ai
     ON a.id = ai.application_id AND
        a.application_type = 328 LEFT JOIN     
    application_org ao 
    ON a.id = ao.application_id  AND
       a.id = 11;

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

0 голосов
/ 24 января 2019

вы можете использовать союз

   SELECT app.* FROM applications app    
        LEFT JOIN application_individu ai 
        ON app.id = ai.application_id
    where app.application_type = 328 
union 
SELECT app.* FROM applications app    
       LEFT JOIN application_org ao 
       ON app.id = ao.application_id 
    where app.application_type != 328 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...