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'
感谢您的帮助。
我在获取此查询的所有结果时遇到了一些问题。 你能帮我解决这个问题吗?
我有这个查询:
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'
感谢您的帮助。