mysql 加入未显示所有行

mysql join not showing all rows

我在获取此查询的所有结果时遇到了一些问题。 你能帮我解决这个问题吗?

我有这个查询:

if (!$SqlCount = $db->sql_query("SELECT count(*) as count FROM
  actividades
  LEFT JOIN tarifas
    ON actividades.id = tarifas.id_actividade
WHERE
  $query
  AND actividades.dias LIKE '%$diaExtenso%'
  AND (tarifas.id_actividade IS NULL
    OR (tarifas.dia = '$dia' AND tarifas.fechado = 0 AND tarifas.id_actividade = actividades.id))
")) {
    message_die("DS", TRUE);
}

如果满足以下条件,我想显示第一个 table 中的所有内容: 在第二个 table 中根本没有匹配项或者 如果当天有匹配项 ($dia) 并且 fechado = 0

如果我有特定日期的规则,尽管选择了日期,它也不会显示任何内容。 我做错了什么?

非常感谢!

编辑:

感谢大家的帮助,我想问题没有提出最好的方式,这就是我认为的问题所在:

查询正在检查 tarifas.id_actividade 是否不为空,如果有一天的规则,假设明天,确实 tarifas.id_actividade 不会为空,它将转到 OR 部分,他会检查当天是否有规则。

因此,今天没有规则,但如果明天有规则,tarifas.id_actividade 将不会为 null,今天也不会有规则.. 所以它不显示任何内容,而且它应该。

有意义吗?我应该 post mysql table 和“$query”部分吗?

再次感谢您帮助我。

请尝试:

if (!$SqlCount = $db->sql_query("SELECT count(A.*) as count FROM
FROM
(
    SELECT * 
    FROM
      actividades
      LEFT JOIN tarifas
        ON actividades.id = tarifas.id_actividade
    WHERE
      $query
      AND actividades.dias LIKE '%$diaExtenso%'
      AND tarifas.id_actividade IS NULL
    UNION ALL
    SELECT *  FROM
      actividades
      INNER JOIN tarifas
        ON actividades.id = tarifas.id_actividade
    WHERE
      $query
      AND actividades.dias LIKE '%$diaExtenso%'
      AND (tarifas.dia = '$dia' AND tarifas.fechado = 0 AND tarifas.id_actividade = actividades.id))
) AS A")) {
    message_die("DS", TRUE);
}

请说出 WHERE 子句中的 $query 元素是什么?

请注意,此查询仍然(可能)很慢,因为它无法在 a.dias 上使用任何索引。而且它只会显示一个计数,因为这就是所要求的。

SELECT COUNT(t.id_actividade) count 
  FROM actividades a
  LEFT 
  JOIN tarifas t
    ON t.id_actividade = a.id 
   AND t.dia = '$dia' 
   AND t.fechado = 0
 WHERE a.dias LIKE '%$diaExtenso%';

我认为这就是您的查询应该做的,尽管 id 上的最后一个条件是不必要的:

SELECT count(*) as count
FROM actividades a LEFT JOIN
     tarifas t
     ON a.id = t.id_actividade 
WHERE $query AND
      a.dias LIKE '%$diaExtenso%' AND
      (t.id_actividade IS NULL OR (t.dia = '$dia' AND t.fechado = 0))

替代公式为:

select a.cnt + b.cnt
from (select count(*) as cnt
      from actividades a
      where not exists (select 1 from tarifas t where a.id = t.id_actividade)
     ) a join
     (select count(*) as cnt
      from actividades a left join
           tarifas t
      where a.id = t.id_actividade and t.dia = '$dia' AND t.fechado = 0
     ) b;

我怀疑 t.dia = '$dia' 部分可能没有像您预期的那样工作。事实上,您应该为此使用参数化查询。

好的伙计们,这是解决问题的方法:

if (!$SqlCount = $db->sql_query("SELECT count(*) as count FROM
  actividades
  LEFT JOIN tarifas
    ON actividades.id = tarifas.id_actividade AND tarifas.dia = '$dia'
WHERE
  $query
  AND actividades.dias LIKE '%$diaExtenso%'
  AND (tarifas.id_actividade IS NULL
    OR (tarifas.dia = '$dia' AND tarifas.fechado = 0 AND tarifas.id_actividade = actividades.id))
")) {
    message_die("DS", TRUE);
}

在 ON 子句中,我添加了 tarifas.dia = '$dia'

感谢您的帮助。