mysql - 带条件的内部连接 - Mysql
问题描述
如果条件为真但它不起作用,我正在尝试进行内部连接,我尝试了以下两种方法:
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
或者
IF(chat.tipo = 'vitima',
INNER JOIN vitima ON vitima.id_vit = chat.id_tipo,
INNER JOIN terceiro ON terceiro.id_ter = chat.id_tipo)
但是两者都给出错误,我想要的是如果类型等于“vitima”,它会在一个表中执行内部 noin,否则在另一个表中。
完整查询:
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
解决方案
这不准确,但我认为这将非常接近你想要做的事情:
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)
条件强制执行您的LEFT JOIN
规则,并且WHERE
条件模拟,INNER JOIN
因为它需要这些记录存在。
使用您发布的完整查询,它看起来像这样:
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
推荐阅读
- ios - 将完整的编程自定义视图添加到 ViewController。自动布局问题
- python - 400 错误请求:KeyError:“文件”
- python - 如何通过 selenium 仅针对 Python 中的当前 Chrome 会话按下键盘按钮
- chocolatey - Chocolatey 问题 - 创建 Powershell 脚本的 zip 包?
- python - 如何将 PDF 转换为 opencv-python 可读的图像?
- node.js - Telegram 机器人可以在单个消息触发器上返回多条消息吗?
- javascript - 我正在尝试编写一个程序,其中球忽略击中绿色障碍,但当红色障碍表示游戏结束时结束游戏
- regex - 提取斜线之间的字符串,但第二个斜线可能不存在
- r - 考虑了嵌套 ifelse 中的一些条件
- c# - 如何在不缩放纹理的情况下实现缩放行为?