MYSQL - 使用子句计数

时间:2014-12-12 11:50:16

标签: mysql count group-by

我正在开发一个聊天室,所有消息都存储在同一个表“消息”中。 我想要的是列出不同的用户并按新消息显示新消息。

这是我的MYSQL表'消息':

假设我是伪'OLIVER'!

  id  | lu     | view_date   | pseudo   | destinataire    | message    | date        |
------+--------+-------------+----------+-----------------+------------+-------------+
 7181 | 0      | 0           | OLIVER   | WILLIAM         | HELLO      | 1418214808  +
 7183 | 0      | 0           | WILLIAM  | OLIVER          | HELLO      | 1418214808  +
 7184 | 0      | 0           | OLIVER   | WILLIAM         | HELLO      | 1418214808  +
 7184 | 1      | 1418214808  | OLIVER   | MIKE            | HELLO      | 1418214808  +
 7101 | 1      | 1418214808  | MIKE     | OLIVER          | HELLO      | 1418214808  +
 7186 | 0      | 0           | SUPERMAN | BATMAN          | HELLO      | 1418214808  +
 7187 | 0      | 0           | DONALD   | MICKEY          | HELLO      | 1418214808  +
 7188 | 0      | 0           | GREG     | OLIVER          | HELLO      | 1418214808  +
 7189 | 0      | 0           | GREG     | WILLIAM         | HELLO      | 1418214808  +             
 7189 | 0      | 0           | FUNKY    | OLIVER          | HELLO      | 1418214808  +             
 7189 | 1      | 1418214808  | BERNARD  | OLIVER          | HELLO      | 1418214808  +             
 7189 | 1      | 1418214808  | OLIVER   | BERNARD         | HELLO      | 1418214808  +             
 7188 | 0      | 0           | GREG     | OLIVER          | HELLO      | 1418214808  +

结果显示仅显示与伪'OLIVER'相关的记录,例如:

pseudo   | total new Messages
---------+-------------------+
 GREG    | 2                  <-- 3 entry but only 2 new message lu field = 0
 WILLIAM | 1                  <-- 2 entry but only 1 new message lu field = 0
 FUNKY   | 1                  <-- 1 entry lu field = 0  
 MIKE    | 0                  <-- 1 entry lu field = 0  
 BERNARD | 0                  <-- 1 entry lu field = 0  

#New(UNREAD)消息处理字段lu和值=“0”

#旧(READ)消息处理字段lu和值=“1”

我的实际查询计算与“OLIVER”相关的所有不同用户的所有邮件如何计算所有不同用户的所有新邮件?

SELECT data, SUM(cnt) AS cnt
FROM (
(
SELECT destinataire AS data, COUNT(id) AS cnt 
FROM message 
WHERE pseudo = '".$_SESSION['pseudo']."' 
GROUP BY data
)
UNION ALL
(
SELECT pseudo AS data, COUNT(id) AS cnt 
FROM message 
WHERE destinataire = '".$_SESSION['pseudo']."' 
GROUP BY data
)
) pd 
GROUP BY data
ORDER BY cnt DESC

1 个答案:

答案 0 :(得分:1)

根据您描述的逻辑,我认为此查询可以满足您的需求:

SELECT destinataire, pseudo, SUM(lu = 0) AS cnt
FROM message
GROUP BY destinataire, pseudo
ORDER BY pseudo, cnt DESC;

您还可以添加where子句,将结果限制为单个destinataire

相关问题