2009-07-31 99 views
0

我目前有一个MySQL SELECT语句,用于从两个表中提取信息以显示用于私人消息传递的“已发送消息”字段。MySQL选择 - 将COUNT与GROUP_CONCAT结合使用

我想知道我可以怎么做COUNT添加到我的查询来计算一个线程“接收器”的数量。

这里是我的表结构的基本精神,(注:两个表之间的关系的领带,是PM-信息的“邮件ID”和pm_data的“ID”):

pm_info: 
    id  message_id receiver_id is_read  read_date 

pm_data: 
    id date_sent title sender_id thread_id content 

这里是我的SELECT语句:

SELECT pm_info.is_read, group_concat(DISTINCT receiver.usrFirst) as receiver_name, 
pm_data.date_sent, pm_data.title, pm_data.thread_id, pm_data.id as data_id, 
MAX(date_sent) AS thread_max_date_sent 
FROM pm_info 
INNER JOIN pm_data ON pm_info.message_id = pm_data.id 
INNER JOIN tblUsers AS receiver ON pm_info.receiver_id = receiver.usrID 
WHERE pm_data.sender_id = '$usrID' 
GROUP BY pm_data.thread_id 
ORDER BY thread_max_date_sent DESC 

它。OUPUTS收件人是这样的:

Message 1 - Recipients: John, David, Steve - thread_id = 1234 
Message 2 - Recipients: Bill, David, John, Ed, Steve - thread_id = 1345 

基本上,我会LIK e要做的是可以选择COUNT收件人,因此在上面的示例中,“消息1”将显示三(3)个收件人,而“消息2”将显示五(5)个收件人。

这样,如果我有一个发送给30个用户的线程/消息,并不是所有的三十个名字都会被打印出来。

谢谢!

+0

注意的GROUP_CONCAT限制,由于其返回值的长度。 – 2009-08-20 07:32:45

回答

0

你可以使用子查询选择最多每封邮件的收件人3,然后另一个子查询来连接他们的名字:

select 
    ( select group_concat(usrFirst separator ', ') 
     from tblUsers 
     where usrId in (
      select usrId 
      from tblUsers 
      where usrId = pm_info.receiver_id 
      limit 3 
     ) 
    ) as receiver_name 
from pm_info 
.... 
2

您是否尝试过只是COUNT更换GROUP_CONCAT?就像这样:

COUNT(DISTINCT receiver.usrFirst) as receiver_count 

或者更好,使用pm_info.receiver_id作为(这有可能让你消除你加入一个):

COUNT(DISTINCT pm_info.receiver_id) as receiver_count 
0

你可以移动的次数和GROUP_CONCAT成CONCAT声明。

... group_concat(DISTINCT receiver.usrFirst) as receiver_name ... 

成为

... concat('messages:', count(distinct receiver.usrFirst),'(',group_concat(DISTINCT receiver.usrFirst),')') as receiver_name ... 
相关问题