2016-01-13 121 views
0

我努力为自己的问题寻找解决方案。使用mysql查询结果无效5.7

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

发生了,我不知道是什么的原因。一个帮助将非常感激!

+0

最可能的解释是,数据之间不同两台服务器。 –

+0

我已经导入了相同的sql文件。所有的行都是一样的 – sUP

回答

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 
      ) ; 
+0

太奇怪了。这两个查询都返回0个结果。当我从'campaign_user cu'中选择*从cu.campaign_id = 91和cu.user_id = 1'时,它确实可以工作,所以这很奇怪:/。当我运行'选择c。*从竞选c其中(选择计数(*)来自campaign_user cu其中cu.campaign_id = c.id和cu.user_id = 1)> = 1'没有'其中id = 91 '它会返回所有相关的广告系列列表,包括91和89(请记住:89确实会返回OK) – sUP

+0

btw - 原始查询由laravel belongsToMany关系 – sUP

+1

@sUP生成。 。 。 Laravel生成劣质查询令人遗憾。 –