2009-07-31 10 views
0

J'ai actuellement une instruction MySQL SELECT qui extrait les informations de deux tables pour afficher un champ "Messages envoyés" pour la messagerie privée.MySQL Select - Combiner COUNT avec GROUP_CONCAT

Je voudrais savoir comment je peux ajouter un COUNT à ma requête pour compter le nombre de "récepteurs" dans un fil.

est ici l'essentiel de base de ma structure de la table, (REMARQUE: le lien relationnel entre les deux tables est le 'message-id' dans h-info et le "id" dans pm_data):

pm_info: 
    id  message_id receiver_id is_read  read_date 

pm_data: 
    id date_sent title sender_id thread_id content 

Voici mon instruction 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 

Et ouputs les destinataires comme ceci:

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

Fondamentalement, ce que je lik e to do a l'option de COUNT les destinataires, donc dans l'exemple ci-dessus, "Message 1" affichera trois (3) destinataires, et "Message 2" affichera cinq (5) destinataires. De cette façon, si j'ai un fil/message qui a été envoyé à 30 utilisateurs, les trente noms ne seront pas imprimés.

Merci!

+0

Soyez conscient des restrictions de GROUP_CONCAT en raison de la longueur de sa valeur de retour. –

Répondre

0

Vous pouvez utiliser une sous-requête pour sélectionner jusqu'à 3 destinataires par message, puis un autre sous-requête pour concaténer leurs noms:

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

Avez-vous essayé simplement de remplacer GROUP_CONCAT avec le comte? Comme ceci:

COUNT(DISTINCT receiver.usrFirst) as receiver_count 

Ou mieux, utiliser pm_info.receiver_id comme dans (ce qui pourrait vous permettre d'éliminer l'un de vos jointures):

COUNT(DISTINCT pm_info.receiver_id) as receiver_count 
0

Vous pouvez déplacer le comte et group_concat dans une déclaration concat .

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

devient

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