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

时间:2018-02-28 11:10:58

标签: mysql

我不明白这一点:以下两个查询几乎相同,唯一不同的是"和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:nullable fk
  • ...此处不相关的其他字段

ek_order_has_order_status:

  • id:pk(我注意到它不需要,但为时已晚......)
  • order_id:fk
  • order_status_id:fk
  • 日期:datetime
  • ...此处不相关的其他字段

ek_order_status:

  • id:pk
  • code:str
  • ...此处不相关的其他字段

数据

ek_order_has_order_status表有一行如下所示:

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

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

  • id:283
  • shop_id:1

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

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

Ps:基本上,我试图获得包含' prepare_order'的订单数量。状态为最终/最新状态,知道订单可以有多种状态。

1 个答案:

答案 0 :(得分: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 ...

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