mysql - 即使其中一个表为空,SELECT 也返回行

标签 mysql sql

我正在尝试从表中选择一些列(与其他表连接)。 它必须返回“beactive_actividades.id”为 2 或“beactive_res_colaboradores.interv_id”为 2 的所有行(在“act.id”=“colab.actividade_id”的行上)。

我的选择有效,但前提是 beactive_res_colaboradores 中有任何行。 如果 beactive_res_colaboradores 为空,它甚至不会返回 usr.id=2 的行,这与我需要的相反。

我需要满足一个条件或另一个条件的所有行。

SELECT DISTINCT act.id, act.descricao, act.detalhes, act.urgencia
, est.id AS estado_id, est.descricao AS estado_desc
, tipo.id AS tipo_id, tipo.descricao AS tipo_desc
, cli.id AS cliente_id, cli.nome AS cliente_nome
, usr.id AS user_id, usr.nome AS user_nome
FROM beactive_actividades AS act
LEFT JOIN beactive_act_estados AS est ON act.estado_id=est.id
LEFT JOIN beactive_act_tipos AS tipo ON act.tipo_id=tipo.id
LEFT JOIN beactive_clientes AS cli ON act.cliente_id=cli.id
LEFT JOIN beactive_users AS usr ON act.interv_id=usr.id
, beactive_res_colaboradores AS colab
WHERE (usr.id=2 OR (colab.interv_id=2 AND act.id=colab.actividade_id))
AND est.id<6
ORDER BY act.urgencia DESC, est.id DESC

我忘了说 beactive_res_colaboradores 是一个辅助表,它将一个 user_id 链接到一个 actividade_id,因此只有 user_id+actividade_id 对是唯一的。

最佳答案

您正在使用 beactive_res_colaboradores 进行 INNER JOIN(使用 , 的旧方式,并在 WHERE 中进行验证),因此您将删除不匹配的每一行在那张 table 上。改为 LEFT JOIN:

SELECT DISTINCT act.id, act.descricao, act.detalhes, act.urgencia
, est.id AS estado_id, est.descricao AS estado_desc
, tipo.id AS tipo_id, tipo.descricao AS tipo_desc
, cli.id AS cliente_id, cli.nome AS cliente_nome
, usr.id AS user_id, usr.nome AS user_nome
FROM beactive_actividades AS act
LEFT JOIN beactive_act_estados AS est ON act.estado_id=est.id
LEFT JOIN beactive_act_tipos AS tipo ON act.tipo_id=tipo.id
LEFT JOIN beactive_clientes AS cli ON act.cliente_id=cli.id
LEFT JOIN beactive_users AS usr ON act.interv_id=usr.id
LEFT JOIN beactive_res_colaboradores AS colab ON act.id=colab.actividade_id
WHERE (usr.id=2 OR colab.interv_id=2) AND est.id<6
ORDER BY act.urgencia DESC, est.id DESC

关于mysql - 即使其中一个表为空,SELECT 也返回行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20336814/

相关文章:

mysql - 在 Windows 上为网站设置 mySQL db 和 TomCat

mysql - SQL : how to select customers who have ordered multiple items

mysql - 如果在表后隐式声明,则在 FROM 子句中设置变量会导致 JOIN 错误

mysql - NULL 值不包含在查询结果中

mysql - 数据库中的重复记录

mysql - 如何在 MYSQL 中更新/使 View 可更新

mysql - iOS 上的回合制多人游戏

java - JPA @Column 注释 getter 不起作用

sql - 计算其 parent 拥有的根的百分比

c# - 如何计算 SQL Server 中的多个列?