2017-07-18 92 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