mysql嵌套查询不使用AND条件

mysql嵌套查询不使用AND条件,mysql,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

我不明白这一点:以下两个查询几乎相同,唯一不同的是和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')
SELECT COUNT(*) as count
FROM ek_order o        
WHERE 1
AND o.shop_id=1
...
查询结果:0我预期为1

我的架构结构如下所示:

ek_订单: id:pk 店铺标识:可为空的fk …此处不相关的其他字段 ek_order_具有_order_状态: id:pk我注意到它不需要,但太晚了。。。 订单号:fk 订单\状态\标识:fk 日期:日期时间 …此处不相关的其他字段 ek_订单状态: id:pk 代码:str …此处不相关的其他字段 数据 ek_order_has_order_status表中有一行如下所示:

身份证号码:182 订单编号:283, 订单状态\u id:7这是ek\u订单状态中的“准备订单”代码 在ek_订单表中,我们可以发现shop_id实际上是1:

身份证号码:283 店铺编号:1 所以我不明白为什么第二个查询返回0而不是1。 我分别测试了查询的所有部分,它们似乎都正常工作。我首先测试了内部查询,然后测试了外部查询,两者都成功了,但是,添加和o.shop_id=1部分会使整个查询失败

有人知道为什么吗?和/或进行修复。 我可以求助于做两个查询,但为了提高我的sql知识,我更愿意了解这一点的根本

Ps:基本上,我试图获取包含“准备订单”状态的订单数量作为其最终/最新状态,知道一个订单可以有多种状态。

在您的第二个查询中:

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')
SELECT COUNT(*) as count
FROM ek_order o        
WHERE 1
AND o.shop_id=1
...
您正在对整个ek_order表进行计数,因此,对于单个记录来说,谈论shop_id值是没有意义的。我怀疑您想要的是,如果您找到任何shop_id值为1的记录,那么这将作为逻辑true传递。如果是,则可以使用EXISTS:

如果这不起作用,那么另一个选项是取shop_id的最大值:


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

谢谢。它与exists语句一起工作。我不确定自己是否理解了其中的原因:因为答案中的第一个语句和o.shop_id=1返回了多行,所以count可以应用于此,或者不能应用于此,但我将尝试收集有关此主题的更多信息。“再次谢谢你。”林说。如果说SELECT COUNT*而不使用GROUP BY`,您是在告诉MySQL返回一条记录,但是如果该记录恰好只有一条记录,那么该记录与表中的一条记录实际上没有任何关系。把计数记录看作是一种总结。