2009-07-31 97 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 ... 
相關問題