多个LEFT JOIN不适用于SUM()

时间:2016-02-22 10:01:31

标签: php mysql sql

所以我们的想法是从3个表中获取信息:

  1. R_Regle:规则表,规则的基本信息
  2. C_Commentaire:此规则的评论数
  3. I_Interet:来自一条规则的所有 upvotes和downvotes的 SUM。
  4. 我的I_Interet的结构: I_ID / I_Idregle / I_Idpseudo / I_Upvote / I_Downvote

    每行只能包含1个upvote或1个downvote。

    因此请求:

        SELECT R_Id, R_Date, R_Titre, R_Contenu, R_Etape, COUNT(C_Commentaire.C_IdRegle) AS CountComment, SUM(I_Interet.I_Up) AS Up ,SUM(I_Interet.I_Down) AS Down 
        FROM R_Regle
                LEFT JOIN C_Commentaire ON C_Commentaire.C_IdRegle = R_Regle.R_Id
                LEFT JOIN I_Interet ON I_Interet.I_IdRegle = R_Regle.R_Id 
         GROUP BY R_ID
    

    我试图获取所有这些信息。

    问题是:

    COUNT(C_Commentaire.C_IdRegle) AS CountComment
    

    给我所有评论和UPVOTES / DOWNVOTES的计数。

    因此,如果有4条评论和3条赞成票,它会像那样计算

     $row['CountComment'] = 7;
    

    但显然,我不希望如此。我想要

    $row['CountComment'] = 4;
    

    有什么想法吗?

    编辑1:

    以下是表格:

    R_REGLE

    CREATE TABLE `R_Regle` (
      `R_Id` int(11) NOT NULL AUTO_INCREMENT,
      `R_Auteur` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `R_Date` date NOT NULL,
      `R_Titre` varchar(150) CHARACTER SET latin1 NOT NULL,
      `R_Contenu` text CHARACTER SET latin1 NOT NULL,
      `R_Etape` int(11) NOT NULL DEFAULT '1' COMMENT '1 = discussion 2= VOTE',
      PRIMARY KEY (`R_Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    

    C_COMMENTAIRE

    CREATE TABLE `C_Commentaire` (
      `C_Id` int(11) NOT NULL AUTO_INCREMENT,
      `C_Date` datetime NOT NULL,
      `C_Pseudo` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
      `C_Contenu` text COLLATE utf8_unicode_ci NOT NULL,
      `C_IdRegle` int(11) NOT NULL,
      PRIMARY KEY (`C_Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    

    I_INTERET

    CREATE TABLE `I_Interet` (
      `I_Id` int(11) NOT NULL AUTO_INCREMENT,
      `I_IdRegle` int(11) NOT NULL,
      `I_Pseudo` varchar(30) COLLATE utf8_unicode_ci NOT NULL,
      `I_Up` tinyint(1) NOT NULL DEFAULT '0',
      `I_Down` tinyint(1) DEFAULT '0',
      PRIMARY KEY (`I_Id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
    

3 个答案:

答案 0 :(得分:2)

我可以建议使用相关查询..不确定这是否是你想要的,因为你没有发布任何难以知道的表结构:

SELECT R_Id, R_Date, R_Titre, R_Contenu, R_Etape,
       (select COUNT(*) from C_Commentaire where C_Commentaire.C_IdRegle = R_Regle.R_Id) AS CountComment, 
       SUM(I_Interet.I_Up) AS Up ,
       SUM(I_Interet.I_Down) AS Down 
FROM R_Regle
        LEFT JOIN I_Interet ON I_Interet.I_IdRegle = R_Regle.R_Id 
GROUP BY R_ID

答案 1 :(得分:1)

按如下所示编写查询:

SELECT R_Regle.R_Id, R_Regle.R_Date, R_Regle.R_Titre, R_Regle.R_Contenu, R_Regle.R_Etape, 
COUNT(C_Commentaire.C_IdRegle) AS CommentCounts, 
SUM(I_Interet.I_Up) AS Up,
SUM(I_Interet.I_Down) AS Down 
FROM R_Regle
    LEFT JOIN C_Commentaire ON R_Regle.R_Id = C_Commentaire.C_IdRegle 
    LEFT JOIN I_Interet ON R_Regle.R_Id = I_Interet.I_IdRegle 
GROUP BY R_Regle.R_ID

答案 2 :(得分:1)

在您的查询中,当您在三个表中进行左连接时,会出现重复记录。

以下查询是实现所需结果的几种方法之一。

SELECT
    t.*,
    SUM(I_Interet.I_Up) AS Up,
    SUM(I_Interet.I_Down) AS Down
FROM
    (    
                SELECT 
                        R_Id,
                        R_Date,
                        R_Titre,
                        R_Contenu,
                        R_Etape,
                        COUNT(c_commentaire.C_IdRegle) countComment

                FROM
                R_Regle LEFT JOIN C_Commentaire ON C_Commentaire.C_IdRegle = R_Regle.R_Id
                GROUP BY R_Regle.R_Id ) t

LEFT JOIN I_Interet ON I_Interet.I_IdRegle = t.R_Id
GROUP BY t.R_Id