【发布时间】:2016-02-22 10:01:31
【问题描述】:
所以想法是从 3 个表中获取信息:
- R_Regle:规则表,规则基本信息
- C_Commentaire: cmets 的数量 这个规则有
- 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_Up和I_Down这两个字段是否包含 0 或 1? -
是的!每个用户每条规则最多 1 票。所以它要么是赞成票,要么是反对票。但不能两者都或不超过 1。