mysql嵌套查询无法使用AND条件

问题描述 投票:0回答:1

我不明白这一点:以下两个查询几乎相同,唯一不同的是“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:

  • id:pk
  • shop_id:可以为空的fk
  • ......其他与此无关的领域

ek_order_has_order_status:

  • id:pk(我注意到它不需要,但为时已晚......)
  • order_id:fk
  • order_status_id:fk
  • 日期:日期时间
  • ......其他与此无关的领域

ek_order_status:

  • id:pk
  • 代码:str
  • ......其他与此无关的领域

数据

ek_order_has_order_status表有一行如下所示:

  • id:182
  • order_id:283,
  • order_status_id:7(这是来自ek_order_status的'prepare_order'代码)

在ek_order表中我们可以发现shop_id确实是1:

  • id:283
  • shop_id:1

所以我不明白为什么第二个查询返回0而不是1.我测试了查询的所有位,它们似乎工作(我首先测试了内部查询,然后是外部查询,两者都成功),但是然后,添加“和o.shop_id = 1”部分使完整查询失败。

有人知道为什么吗?和/或有一个修复。 (我可以尝试两个查询,但为了提高我的sql知识,我宁愿理解这个问题的底部)。

Ps:基本上,我正在尝试将包含'prepare_order'状态的订单数量作为其最终/最新状态,知道订单可以有多个状态。

mysql
1个回答
1
投票

在您的第二个查询中:

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 ...

如果您确定此表只有一个记录,并且您只想将其值与计数内联,则这是有意义的。

© www.soinside.com 2019 - 2024. All rights reserved.