基于CASE的左联接

时间:2019-01-24 10:04:45

标签: mysql sql

我想在MySQL中进行Left Join。联接基于条件。例如,如果值为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 :(得分:2)

您可以使用工会

   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 

答案 1 :(得分:1)

您应该将逻辑放在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 *。至少,当列在不同的表中具有相同的名称时,您将有命名冲突-在这种情况下很可能会发生。

答案 2 :(得分:1)

要有条件地联接表,仅意味着在SQL中对其进行外部联接。因此,结果行中将包含一个信息或另一个信息。最后,您将得到与添加到请求中的查询类似的查询。

在我看来,组合参数表没有任何意义。取而代之的是有一个状态表和一个appender_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;

答案 3 :(得分:0)

您可以尝试以下操作-将左联接与ON条件中的施加条件一起使用

    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