2009-07-31 14 views
0

Ich habe derzeit eine MySQL SELECT-Anweisung, die Informationen aus zwei Tabellen zieht, um ein "Gesendete Nachrichten" -Feld für private Nachrichten anzuzeigen.MySQL Select - Kombinieren COUNT mit GROUP_CONCAT

Ich würde gerne wissen, wie ich eine COUNT zu meiner Abfrage hinzufügen kann, um die Anzahl der "Empfänger" in einem Thread zu zählen.

Hier ist der grundlegende Kern meiner Tabellenstruktur, (Anmerkung: die relationale Verbindung zwischen den beiden Tabellen ist die 'Message-ID' in PM-info und die "id" in pm_data):

pm_info: 
    id  message_id receiver_id is_read  read_date 

pm_data: 
    id date_sent title sender_id thread_id content 

hier ist meine SELECT Statement:

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 

Und es ouputs die Empfänger wie folgt aus:

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

Im Grunde, was ich würde lik Sie haben die Möglichkeit, die Empfänger zu ZÄHLEN. Im obigen Beispiel würde "Nachricht 1" drei (3) Empfänger anzeigen, und "Nachricht 2" würde fünf (5) Empfänger anzeigen.

Auf diese Weise, wenn ich einen Thread/eine Nachricht habe, die an 30 Benutzer gesendet wurde, werden nicht alle dreißig Namen ausgedruckt.

Danke!

+0

von Group_concat Einschränkungen bewusst sein, wegen der Länge seines Rückgabewertes. –

Antwort

0

könnten Sie eine Unterabfrage verwenden, um 3 Empfänger pro Nachricht zu wählen, und dann eine andere Unterabfrage, ihre Namen zu verketten:

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

Haben Sie versucht, nur GROUP_CONCAT mit COUNT zu ersetzen? Wie folgt aus:

COUNT(DISTINCT receiver.usrFirst) as receiver_count 

Oder besser, verwenden pm_info.receiver_id wie in (die potenziell Sie eines Ihrer schließt sich beseitigen lassen konnte):

COUNT(DISTINCT pm_info.receiver_id) as receiver_count 
0

Sie könnten die Zählung und Group_concat in eine concat Aussage bewegen .

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

wird

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