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