mysql 5.7

时间:2016-01-13 12:41:53

标签: mysql

我正努力为我的问题找到解决方案。

我基本上有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中

我不知道是什么原因造成的。真的很感激帮助!

1 个答案:

答案 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
             ) ;