2

ダイアログとメッセージがあります。目標は、ダイアログと未読メッセージの数を選択することです。テーブル メッセージにはunread、それを検出するためのフィールドがあります。

私はこれを試しました

SELECT *, count(unread) as nums 
FROM dialogs JOIN messages ON dialogs.id=messages.dialog_id  
GROUP BY dialogs.id 
HAVING count(unread) <> 0

ただし、常にメッセージの総数を取得します

4

3 に答える 3

1

おー!!!messages.id でカウントします。これを試して:

SELECT *, count(messages.id) as nums FROM dialogs  
      JOIN messages ON dialogs.id=messages.dialog_id  
      WHERE messages.unread = 1 
      GROUP BY dialogs.id 
      HAVING nums <> 0

messages.unread の列挙型は、引用符で囲む必要がある場合があります。

SELECT *, count(messages.id) as nums FROM dialogs  
      JOIN messages ON dialogs.id=messages.dialog_id  
      WHERE messages.unread = '1' 
      GROUP BY dialogs.id 
      HAVING nums <> 0

なぜ enum('0','1') を作成するのかわかりませんが....

于 2012-10-26T19:29:42.277 に答える
1

messagesテーブルに列があると言った場合、unreadその列を数えるべき理由がわかりません。おそらくそれらの値を合計する必要があります(そのテーブルに同じレコードが複数存在する可能性があると仮定しdialog_idます)。したがって、次のようにクエリを記述します。

SELECT *
FROM dialogs D
INNER JOIN (SELECT dialog_id, COUNT(*) AS nums
            FROM messages
            WHERE unread = 1
            GROUP BY dialog_id) M
ON D.id = M.dialog_id  
WHERE M.nums > 0
于 2012-10-26T19:31:02.167 に答える
1

あなたが述べたように、「未読」が未読メッセージの数である場合、ゼロであっても常に値があり、常にCOUNT(未読)に含まれます。

挿入してみてくださいWHERE messages.unread != 0

于 2012-10-26T19:35:00.157 に答える