[英]INNER JOIN with Condition - Mysql
I'm trying to make an inner join if a condition is true but it does not work, I've tried these 2 ways: 如果条件为真但我尝试建立内部联接,但它不起作用,我尝试了以下两种方法:
IF chat.tipo = 'vitima' THEN
INNER JOIN vitima ON vitima.id_vit = chat.id_tipo
ELSE
INNER JOIN terceiro ON terceiro.id_ter = chat.id_tipo
or 要么
IF(chat.tipo = 'vitima',
INNER JOIN vitima ON vitima.id_vit = chat.id_tipo,
INNER JOIN terceiro ON terceiro.id_ter = chat.id_tipo)
But both give error, what I want is if the type equals "vitima" it does the inner noin in one table, otherwise in the other. 但是两者都会出错,我想要的是,如果类型等于“ vitima”,则它在一个表中执行内部noin,否则在另一个表中执行。
Full query: 完整查询:
SELECT ocorrencia.id_oco,
(SELECT GROUP_CONCAT(c.id_oco ORDER BY c.id_oco DESC) FROM ocorrencia as c WHERE c.id_sup_oco = ocorrencia.id_sup_oco) as grouped_ids,
ocorrencia.id_sup_oco,
chat.id_tipo,
suporte_oco.data_sup,
suporte_oco.placa_sup,
suporte_oco.sinistro_sup,
suporte_oco.prefixo_sup,
ocorrencia.id_emp_oco,
IF(chat.tipo = 'vitima', vitima.nome_vit, terceiro.nome_ter) as nome,
chat.tipo
FROM chat
INNER JOIN ocorrencia ON ocorrencia.id_oco = chat.id_oco_cha
INNER JOIN suporte_oco ON suporte_oco.id_sup = ocorrencia.id_sup_oco
IF chat.tipo = 'vitima'
INNER JOIN vitima ON vitima.id_vit = chat.id_tipo
ELSE
INNER JOIN terceiro ON terceiro.id_ter = chat.id_tipo
WHERE chat.id_user = '20' OR chat.id_user_req = '20' GROUP BY (chat.id_oco_cha) ORDER BY chat.data DESC
You cannot use conditions in join
, probably its easier to use union
like: 在不能使用的条件join
,可能是它更容易使用union
,如:
select * from chat inner join vitima ON
union all
select * from chat inner join terceiro ON chat.tipo <> 'vitima' AND terceiro.id_ter = chat.id_tipo
another variant I can think of is: 我可以想到的另一个变体是:
select *
from chat, vitima, terceiro
where
(chat.tipo = 'vitima' AND vitima.id_vit = chat.id_tipo)
OR
(chat.tipo <> 'vitima' AND terceiro.id_ter = chat.id_tipo)
It's not exact, but I think this would come really close to what you're trying to do: 这不是确切的,但是我认为这将非常接近您要尝试执行的操作:
LEFT JOIN vitima ON vitima.id_vit = chat.id_tipo AND chat.tipo = 'vitima'
LEFT JOIN terceiro ON terceiro.id_ter = chat.id_tipo AND chat.tipo != 'vitima'
...
WHERE (chat.tipo = 'vitima' AND vitima.id_vit IS NOT NULL)
OR (chat.tipo != 'vitima' AND terceiro.id_ter IS NOT NULL)
The LEFT JOIN
conditions enforce your rules and the WHERE
condition simulates and INNER JOIN
since it requires those records to exist. LEFT JOIN
条件强制执行您的规则,而WHERE
条件则模拟和INNER JOIN
因为它要求这些记录存在。
With the complete query you posted it would look like this: 使用您发布的完整查询,它看起来像这样:
SELECT ocorrencia.id_oco,
(SELECT GROUP_CONCAT(c.id_oco ORDER BY c.id_oco DESC) FROM ocorrencia as c WHERE c.id_sup_oco = ocorrencia.id_sup_oco) as grouped_ids,
ocorrencia.id_sup_oco,
chat.id_tipo,
suporte_oco.data_sup,
suporte_oco.placa_sup,
suporte_oco.sinistro_sup,
suporte_oco.prefixo_sup,
ocorrencia.id_emp_oco,
IF(chat.tipo = 'vitima', vitima.nome_vit, terceiro.nome_ter) as nome,
chat.tipo
FROM chat
INNER JOIN ocorrencia ON ocorrencia.id_oco = chat.id_oco_cha
INNER JOIN suporte_oco ON suporte_oco.id_sup = ocorrencia.id_sup_oco
LEFT JOIN vitima ON vitima.id_vit = chat.id_tipo AND chat.tipo = 'vitima'
LEFT JOIN terceiro ON terceiro.id_ter = chat.id_tipo AND chat.tipo != 'vitima'
WHERE chat.id_user = '20' OR chat.id_user_req = '20'
AND (
(chat.tipo = 'vitima' AND vitima.id_vit IS NOT NULL)
OR (chat.tipo != 'vitima' AND terceiro.id_ter IS NOT NULL)
)
GROUP BY (chat.id_oco_cha) ORDER BY chat.data DESC
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.