mysql join没有显示所有行

时间:2015-01-05 13:55:51

标签: php mysql

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

我有这个问题:

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);
}

我希望在第一个表格中显示以下内容: 在第二个表OR中根本没有匹配 如果当天有匹配($ dia)和fechado = 0

如果我有一个特定日子的规则,它只是没有显示任何东西,尽管选择了一天。 我做错了什么?

非常感谢!

编辑:

感谢帮助人员,我想问题不是最好的方式,这就是我认为这就是问题所在:

查询是否检查tarifas.id_actividade是否为空,如果有一天的规则,让我们说明天,确实tarifas.id_actividade将不会为空,它将转到OR部分,在那里他检查是否有当天的规则。

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

它有意义吗?我应该发布mysql表和“$ query”部分吗?

再次感谢您帮助我。

4 个答案:

答案 0 :(得分:1)

请注意,此查询仍然(可能)很慢,因为它无法在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%';

答案 1 :(得分:1)

我认为这是您的查询应该做的事情,尽管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'篇幅可能无法正常运作。实际上,您应该为此使用参数化查询。

答案 2 :(得分:0)

请尝试:

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);
}

请告诉$query子句中的WHERE元素是什么?

答案 3 :(得分:0)

好的,伙计们解决了这个问题:

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'

感谢您的帮助。