显示左连接的所有行

时间:2016-08-08 09:34:23

标签: mysql sql

我有这样的查询

SELECT IF(viaturas.transportador IS NULL,
       'Sem transportador', viaturas.transportador) AS transportador,
       SUM(IFNULL(retorno_euro,0))- SUM(IFNULL(devolucao_euro,0)) AS total_euro,
       SUM(IFNULL(retorno_ddf,0))- SUM(IFNULL(devolucao_ddf,0)) AS total_ddf,
       SUM(IFNULL(retorno_vadias_plast,0))- SUM(IFNULL(devolucao_vadias_plast,0)) AS total_plast
FROM transportes.transportation_order
    LEFT JOIN transportes.viaturas ON viaturas.viatura=transportation_order.viatura
WHERE estado NOT IN ('cancelado', 'eliminado')
  AND servico IN ('Distribuição', 'Devolução', 'Re-Entrega')
  AND DATA >= '2016-08-08'
GROUP BY LOWER(transportador);

但仅显示匹配行的结果。 我怎样才能展示所有" tranportador"甚至在表之间没有匹配的情况下行?

1 个答案:

答案 0 :(得分:1)

LEFT JOIN时,将右侧表条件放在ON子句中以获得真正的LEFT JOIN行为。 (在WHERE条款中,您将获得定期INNER JOIN结果。)

SELECT IF(viaturas.transportador IS NULL,
       'Sem transportador', viaturas.transportador) AS transportador,
       SUM(IFNULL(retorno_euro,0))- SUM(IFNULL(devolucao_euro,0)) AS total_euro,
       SUM(IFNULL(retorno_ddf,0))- SUM(IFNULL(devolucao_ddf,0)) AS total_ddf,
       SUM(IFNULL(retorno_vadias_plast,0))- SUM(IFNULL(devolucao_vadias_plast,0)) AS total_plast
FROM transportes.transportation_order
    LEFT JOIN transportes.viaturas ON viaturas.viatura=transportation_order.viatura
  AND estado NOT IN ('cancelado', 'eliminado')
  AND servico IN ('Distribuição', 'Devolução', 'Re-Entrega')
  AND DATA >= '2016-08-08'
GROUP BY LOWER(transportador);