2016-08-19 12 views
1

上記の表から、parent_id = 0、sender_idまたはreceiver_idがすべて私のログインIDと等しいすべてのメッセージを含むリストを抽出したかったのです。同じMYSQLクエリの親子メッセージ

Table:Messages 
id | parent_id | sender_id | receiver_id | subject | message | read 

これは簡単だったが、私は= 0

PARENT_IDは、私はこの試みたメッセージのためにすべての子メッセージをカウントする方法を見つけ出すことができませんでした:私はできませんでした

$my_messages = mysql_query(" 
    SELECT 

messages.id, messages.sender_id, messages.receiver_id, messages.subject, messages.message, messages.minute, 
messages.hour, messages.day, messages.month, messages.year, COUNT(*) as 'mcount' 
    FROM messages 
    LEFT JOIN messages AS mchild ON mchild.parent_id = messages.id 
    WHERE(messages.sender_id='$login_session' or messages.receiver_id='$login_session') 
    and messages.parent_id = '0' 
    ORDER BY messages.year DESC, messages.month DESC, messages.day DESC, messages.hour DESC, messages.minute DESC 

"); 

追加のものを私はどのparent_id = 0のすべての子+親メッセージをどのように数えるのですか?sender_id = $ login_idの場合はread = 1、receiver_id = $ login_idの場合はread = 1

ここに例があります:

Table:Messages 
id | parent_id | sender_id | receiver_id | subject | message | read 
1 |   0 | Paul  | John  | Test | Test | 0 
2 |   0 | Paul  | Chris  | Test | Test | 0 
3 |   1 | john  | Paul  | Test | Test | 0 
4 |   1 | Paul  | John  | Test | Test | 1 
5 |   1 | John  | John  | Test | Test | 0 
6 |   0 | Paul  | Jack  | Test | Test | 0 

は出力:

ID:1 - 4 messages (1 parent+ 3 children), $unread=1 because read = 1 for ID:4 wich is a child for ID:1 
ID:2 - 1 message 
ID:6 - 1 message 

答えて

0

自己を使用して参加:

SELECT m1.id, 
     COUNT(*) AS childCount 
FROM messages m1 
INNER JOIN 
messages m2 
    IN m1.id = m2.parent_id 
WHERE '$login_session' IN(m1.sender_id,m1.receiver_id) 
    AND m1.id = 0 -- you can remove this condition if you want all parents 

GROUP BY m1.id 

通常COUNT機能は、この場合のグループは、それぞれの親である、GROUP BYと共に使用されます。しかし、あなたはparent_idを0にしたいだけなので、これをWHERE節に追加しました。これは、このグループ以外のすべてのグループを除外します。それ以上の情報が必要な場合は削除することができます。

+0

これは良いスタートですが、0人の子供を持つ両親を出力しません....私も変更されました。 AND m1.id = 0かつAND m1.parent_id = 0である。 parent_id = 0でなくても、すべての親をどのように出力するかについての考え方はありますか? –

+0

INNER JOINをLEFT JOINに変更しても問題ありません。 (asigned parent_idにエラーがないと仮定します)。 $ login_sesionのメッセージだけを出力するようにするには、このAND(m2.sender_id = '$ login_session'またはm2.receiver_id = '$ login_session')を付けましたが、子を持たない親は表示されません。古い問題です...私は内側の結合の代わりにLEFT JOINを使ってあなたの体を使用します。 –