我正努力为我的问题找到解决方案。
我基本上有3个表 - 广告系列,用户,campaign_user(数据透视表 - 包含campaign_id,user_id)
我有这个问题:
select * from `campaigns`
where `id` = 91
and (select count(*)
from `users`
inner join `campaign_user` on `users`.`id` = `campaign_user`.`user_id`
where `campaign_user`.`campaign_id` = `campaigns`.`id`
and `user_id` = 1) >= 1
返回0结果。我已检查campaign_user
表中的相关行是否存在。
奇怪的是,如果我为另一个广告系列ID(89)运行相同的查询,它会返回预期的结果。有些广告系列ID会按预期返回,有些会返回0 ..奇怪而且令人讨厌。
在运行mysql 5.5的生产服务器中不会发生这种情况
但它发生在运行mysql 5.7的VM中
我不知道是什么原因造成的。真的很感激帮助!
答案 0 :(得分:1)
最可能的解释是两台服务器上的数据不同。但是,您可以简化查询,这就是我回答的原因。子查询中不需要users
表。所以:
select c.*
from `campaigns` c
where c `id` = 91 and
(select count(*)
from campaign_user cu
where cu.`campaign_id` = c.`id` and cu.user_id = 1
) >= 1;
反过来,使用exists
(或left join
)代替count(*)
可以简化并提高效率:
select c.*
from campaigns c
where c id = 91 and
exists (select 1
from campaign_user cu
where cu.campaign_id = c.id and cu.user_id = 1
) ;