我不明白这一点:以下两个查询几乎相同,唯一不同的是“and o.shop_id = 1”部分,但它们不会产生预期的结果。
第一个查询:
select count(*) as count
from ek_order o
where 1
and
(
select
s.code
from ek_order_status s
inner join ek_order_has_order_status h on h.order_status_id=s.id
where o.id=h.order_id
order by h.date DESC
limit 0,1
) in ('preparing_order')
查询结果:1
第二个查询:
select count(*) as count
from ek_order o
where 1
and o.shop_id=1
and
(
select
s.code
from ek_order_status s
inner join ek_order_has_order_status h on h.order_status_id=s.id
where o.id=h.order_id
order by h.date DESC
limit 0,1
) in ('preparing_order')
查询结果:0(我预计1!)
我的架构结构如下所示:
ek_order_has_order_status表有一行如下所示:
在ek_order表中我们可以发现shop_id确实是1:
所以我不明白为什么第二个查询返回0而不是1.我测试了查询的所有位,它们似乎工作(我首先测试了内部查询,然后是外部查询,两者都成功),但是然后,添加“和o.shop_id = 1”部分使完整查询失败。
有人知道为什么吗?和/或有一个修复。 (我可以尝试两个查询,但为了提高我的sql知识,我宁愿理解这个问题的底部)。
Ps:基本上,我正在尝试将包含'prepare_order'状态的订单数量作为其最终/最新状态,知道订单可以有多个状态。
在您的第二个查询中:
SELECT COUNT(*) as count
FROM ek_order o
WHERE 1
AND o.shop_id=1
...
你正在计算整个ek_order
表,因此对于单个记录来说,shop_id
值甚至没有意义。我怀疑你想要的是,如果你发现任何shop_id
值为1的记录,那么这是合乎逻辑的。如果是这样,那么你可以使用EXISTS
:
SELECT COUNT(*) as count
FROM ek_order o
WHERE 1
AND EXISTS (SELECT 1 FROM ek_order WHERE shop_id=1)
AND ...
如果这不起作用,那么另一种选择是采用shop_id
的最大值:
SELECT COUNT(*) as count
FROM ek_order o
WHERE 1
AND MAX(shop_id) = 1
AND ...
如果您确定此表只有一个记录,并且您只想将其值与计数内联,则这是有意义的。