我正在尝试从表中选择一些列(与其他表连接)。 它必须返回“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/