我正在尝试计算单个用户发布的总评论数。这是表的表结构comments:
comments
CREATE TABLE `PLD_COMMENT` ( `ID` int(11) NOT NULL auto_increment, `ITEM_ID` varchar(11) NOT NULL, `USER_ID` varchar(11) NOT NULL, `USER_NAME` varchar(255) NOT NULL, `COMMENT` longtext, `COMMENT_TITLE` varchar(255) default NULL, `COMMENT_RATING` tinyint(1) default '1', `TYPE` int(11) NOT NULL, `DATE_ADDED` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `IPADDRESS` varchar(15) default NULL, `STATUS` varchar(11) NOT NULL, PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=latin1
这里是表结构user表
user
CREATE TABLE `pld_user`( `ID` int(11) NOT NULL auto_increment, `LOGIN` varchar(100) NOT NULL, `NAME` varchar(255) NOT NULL, `PASSWORD` varchar(46) NOT NULL, `LEVEL` tinyint(4) NOT NULL default '0', `RANK` tinyint(4) NOT NULL default '0', `ACTIVE` tinyint(4) NOT NULL default '0', `LAST_LOGIN` timestamp NOT NULL default CURRENT_TIMESTAMP on update CURRENT_TIMESTAMP, `REGISTRATION_DATE` timestamp NOT NULL default '0000-00-00 00:00:00', `AUTH_IMG` varchar(255) default NULL, `AUTH_IMGTN` varchar(255) default NULL, `SUBMIT_NOTIF` tinyint(4) NOT NULL default '1', `PAYMENT_NOTIF` tinyint(4) NOT NULL default '1', `ADDRESS` varchar(255) default NULL, `EMAIL` varchar(255) NOT NULL, `WEBSITE` varchar(255) default NULL, `WEBSITE_NAME` varchar(255) default NULL, `INFO` varchar(255) default NULL, `ANONYMOUS` tinyint(4) NOT NULL default '0', `LANGUAGE` varchar(2) default NULL, `AVATAR` varchar(100) default NULL, `ICQ` varchar(15) default NULL, `AIM` varchar(255) default NULL, `YIM` varchar(255) default NULL, `MSN` varchar(255) default NULL, `CONFIRM` varchar(10) default NULL, `NEW_PASSWORD` varchar(46) default NULL, `EMAIL_CONFIRMED` int(11) NOT NULL default '1', `LNAME` varchar(255) default NULL, `CITY` varchar(255) default NULL, `STATE` varchar(255) default NULL, `DOB` date default NULL, `UTYPE` tinyint(1) NOT NULL default '0', PRIMARY KEY (`ID`) ) ENGINE=MyISAM AUTO_INCREMENT=8 DEFAULT CHARSET=latin1 COMMENT='Stores all the users with informations'
这是我的查询:
SELECT count(c.USER_ID) as total_commments_user , c.*, u.NAME, l.TITLE as LINK_TITLE, u.AUTH_IMG FROM `PLD_COMMENT` c left outer join `PLD_USER` u ON (u.ID = c.USER_ID) left outer join `PLD_LINK` l ON (l.ID = c.ITEM_ID AND l.STATUS='2') WHERE c.TYPE = '1' AND c.STATUS = '2' group by c.ID ORDER BY c.ID DESC LIMIT 0 , 3
当我运行此查询时,在的每一行中都有1 total_comments_user。
total_comments_user
任何的想法?
您需要将SELECT子句中除之外的所有列添加c.USER_ID到GROUP BY子句中,如下所示:
SELECT
c.USER_ID
GROUP BY
group by c.ID, c.otherfields, l.title,..
编辑: 我认为以下将正常工作:
SELECT count(c.USER_ID) as total_commments_user , c.*, u.NAME, l.TITLE as LINK_TITLE, u.AUTH_IMG FROM `PLD_COMMENT` c left outer join `PLD_USER` u ON (u.ID = c.USER_ID) left outer join `PLD_LINK` l ON (l.ID = c.ITEM_ID) group by c.ITEM_ID, c.USER_ID ORDER BY c.USER_ID, l.ID
示例: 如果您具有以下示例数据:
PLD_LINK:
ID STATUS TITLE
1 1 title1 2 2 title2
PLD_USER:
ID NAME
8 Mahmoud 9 Ahmed
PLD_COMMENT:
ID ITEM_ID USER_ID STATUS
4 1 8 1 5 1 8 1 6 1 8 1 7 2 8 2 8 2 8 2 9 1 9 1 10 1 9 1
Mahmoud
然后,上一个查询将为您提供每个用户和每个项目的评论计数,如下所示:
total_commments_user ID ITEM_ID USER_ID Name 3 4 1 8 Mahmoud 2 7 2 8 Mahmoud 2 9 1 9 Ahmed
请注意,由于用户Mahmoud具有不同的,因此该用户以不同的计数显示了两次Item_Id。
Item_Id
如果要获取所有项目的每个用户的评论数,则只需要按进行分组USER_ID,那么您将获得:
USER_ID
total_commments_user ID ITEM_ID USER_ID Name 5 4 1 8 Mahmoud 3 9 1 9 Ahmed
正如您现在所看到的,因为我们使该用户Mahmoud无效,所以该用户仅显示一次Item_Id。
然后,您可以按状态或其他条件进行过滤。