2016-01-13 115 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生成劣質查詢令人遺憾。 –