我正在尝试计算单个用户发布的总评论数。以下是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
表
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
当我运行此查询时,我在total_comments_user
下的每一行中得到1。
有什么想法吗?
答案 0 :(得分:2)
您需要将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
。
Mahmoud
只展示了一次:如果您想获得所有项目的每个用户的评论计数,那么您只需要按USER_ID
进行分组,您将获得:
total_commments_user ID ITEM_ID USER_ID Name
5 4 1 8 Mahmoud
3 9 1 9 Ahmed
正如您现在所看到的,用户Mahmoud
只显示一次,因为我们正在进行Item_Id
。
然后您可以按状态或任何状态进行过滤。
答案 1 :(得分:1)
这是因为group by子句将按所有选择标准对计数进行分组。因此,由于l.title值不同,您只能获得l.title的用户ID计数。
基本上,您可以将其中一列作为选择计数。即
(select count(*) from tables where) as totalcount
返回将为您提供该用户标识的每个实例的计数,并且它将在该用户标识的每一行中显示该计数。您必须添加条件子句才能使子选择仅查看与该用户标识相关的行。