【问题标题】:Multiple LEFT JOIN doesn't work on SUM()多个 LEFT JOIN 不适用于 SUM()
【发布时间】:2016-02-22 10:01:31
【问题描述】:

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

  1. R_Regle:规则表,规则基本信息
  2. C_Commentaire: cmets 的数量 这个规则有
  3. I_Interet:对一条规则的赞成票和反对票的总和

我的 I_Interet 的结构: I_ID / I_Idregle / I_Idpseudo / I_Upvote / I_Downvote

每行只能包含 1 个赞成票或 1 个反对票。

所以有了这个要求:

    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

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

所以如果有 4 个 cmets 和 3 个 downvotes,它会这样计算

 $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;

【问题讨论】:

  • I_UpI_Down 这两个字段是否包含 0 或 1?
  • 是的!每个用户每条规则最多 1 票。所以它要么是赞成票,要么是反对票。但不能两者都或不超过 1。

标签: php mysql sql


【解决方案1】:

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

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

【讨论】:

  • prntscr.com/a6gl4o 这是表结构!我用所有 CREATE 表代码编辑了我的第一篇文章!我要试试你给的:)
  • 它做到了!非常感谢 !这是一个奇怪的结构,但我会调查它。非常感谢您的帮助
  • 没问题..我认为您也可以将查询更改为 count(distinct c_commentaire.cid) ,它会完成工作。
【解决方案2】:

按如下方式编写您的查询:

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

【讨论】:

    【解决方案3】:

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

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

    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
    

    【讨论】:

    • 能否请您发布您的相关表结构?我的意思是发布你的create table code
    • 我已经用所有创建表代码编辑了我的初始帖子,这是结构prntscr.com/a6gl4o的prt scrn
    • 如果我不清楚,这里有两种可能的情况:prntscr.com/a6gpgv
    • 对不起,我忘了在内部查询中添加GROUP BY R_Regle.R_Id。 @user3089871
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-07
    • 2021-11-21
    • 2017-10-26
    • 2019-06-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多