2017-07-18 76 views
0

我有這樣的SQL查詢同樣的sql查詢不同的結果?

SELECT tt.ID_Partenaire, tt.Nom_Societe,tt.Image_Societe, tt.id_activite 
       FROM affiliate AS a 
       RIGHT JOIN 
        (SELECT partenaires.ID_Partenaire, 
        partenaires.Nom_Societe, partenaires.Image_Societe, partenaires.id_activite, 
         IFNULL(SUM(c.montant_real),0) AS mt1 
        FROM partenaires 
         LEFT JOIN commande AS c 
        ON partenaires.ID_Partenaire=c.id_partenaire 
        GROUP BY partenaires.ID_Partenaire 
       )AS tt 
      ON a.id_partenaire= tt.ID_Partenaire 
      GROUP BY tt.ID_Partenaire 
      ORDER BY (IFNULL(SUM(a.montat),0) + mt1) DESC 
      LIMIT 20 

我有兩個服務器:

  1. 版本都serveur:5.7.11日誌 - MySQL社區服務器(GPL)-locally-
  2. 服務器版本:10.1.25-MariaDB-1〜jessie-mariadb.org二進制發行版 - 主機 -

當我在這些服務器上執行它時,它們每個都給我一個不同的結果。

我認爲這個問題是在ORDER BY

作爲一個解決方案,我提出:

SELECT ID_Partenaire, Nom_Societe, Image_Societe, id_activite 
     FROM (SELECT tt.ID_Partenaire, tt.Nom_Societe,tt.Image_Societe, 
      tt.id_activite, 
      (IFNULL(SUM(a.montat),0) + mt1) as mm 
       FROM affiliate AS a 
       RIGHT JOIN 
        (SELECT partenaires.ID_Partenaire, 
         partenaires.Nom_Societe, partenaires.Image_Societe, 
         partenaires.id_activite, 
         IFNULL(SUM(c.montant_real),0) AS mt1 
        FROM partenaires 
         LEFT JOIN commande AS c 
        ON partenaires.ID_Partenaire=c.id_partenaire 
        GROUP BY partenaires.ID_Partenaire 
       )AS tt 
      ON a.id_partenaire= tt.ID_Partenaire 
      GROUP BY tt.ID_Partenaire 
      ORDER BY mm DESC 
      LIMIT 20) AS k 

我真的很困惑,因爲MySQL不給我任何錯誤,但給出不同的結果,我還有其他疑問我擔心他對他們也是這樣做的!

+0

檢查,如果兩個服務器使用不同發動機 – Kai

+2

結果有什麼不同?你確實在兩臺服務器上都有相同的數據? – JeffUK

+0

假設'ID_Partenaire'是'partenaires'上的PK,它不應該是一個問題;但如果不是,則應該注意,選擇未分組的非聚合字段可能會產生不同的結果,甚至MySQL系列以外的許多(任何?)RDBMS都不允許這樣做。 – Uueerdo

回答

0

您可以使用explain report找到差異。只需運行explain extended SELECT ID_Partenaire, Nom_Societe...

0

在塊之後添加限制。 「限制」和「ORDER BY」是「按訂單」發生在以前做過同級別「限制」,所以給不同的結果

嘗試這樣的事情

SELECT ID_Partenaire, 
    Nom_Societe, 
    Image_Societe, 
    id_activite 
FROM 
    (SELECT tt.ID_Partenaire, 
    tt.Nom_Societe, 
    tt.Image_Societe, 
    tt.id_activite, 
    (IFNULL(SUM(a.montat),0) + mt1) AS mm 
    FROM affiliate     AS a 
    RIGHT JOIN 
    (SELECT partenaires.ID_Partenaire, 
     partenaires.Nom_Societe, 
     partenaires.Image_Societe, 
     partenaires.id_activite, 
     IFNULL(SUM(c.montant_real),0) AS mt1 
    FROM partenaires 
    LEFT JOIN commande AS c 
    ON partenaires.ID_Partenaire=c.id_partenaire 
    GROUP BY partenaires.ID_Partenaire 
    )AS tt ON a.id_partenaire= tt.ID_Partenaire 
    GROUP BY tt.ID_Partenaire 
    ORDER BY mm DESC 
) AS k LIMIT 20