我想在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
,这样我就不会在连接上重复参数。
答案 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