繁体   English   中英

相同的SQL查询不同的结果?

[英]same sql query different results ?

我有这个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. 服务版本:5.7.11-log-MySQL Community Server(GPL)-本地-
  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不会给我任何错误,但是会给出不同的结果,我还有其他查询,而且我担心他会为他们做同样的事情!

您可以使用解释报告找到区别。 只需运行explain extended SELECT ID_Partenaire, Nom_Societe...

在逐个订单之后添加限制。 'limit'和'order by'在'order by'发生之前处于同一级别'limit'完成,因此给出不同的结果

尝试这样的事情

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  

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM