Mysql查询获取未读响应计数

时间:2012-06-10 16:30:26

标签: mysql

我有三个MYSQL表

Requests -  request_id, request_msg, user_id, request_datetime
Responses - response_id, request_id, response_msg, user_id, response_datetime, readflag
Users-      user_id, user_email, user_name

readflag = 0 or 1

我想获取用户的所有请求,其中此请求的至少1个响应未读,此请求的总响应计数和未读响应计数。

2 个答案:

答案 0 :(得分:2)

试试这个:

SELECT 
    a.request_id,
    COUNT(*) AS total_response_count,
    COUNT(b.request_id) AS unread_response_count
FROM
    Requests a
LEFT JOIN
    Responses b ON a.request_id = b.request_id AND b.readflag = 0
GROUP BY
    a.request_id
HAVING 
    COUNT(b.request_id) > 0

在这里,我们LEFT JOIN关于的关系的Responseses表,以及,其中消息未读(b.readflag = 0)。这使得具有读取响应的所有行都具有b.response_id的NULL值。由于COUNT()不会将NULL计入其计算中,因此我们仅过滤至少有1个未读响应(HAVING COUNT(b.request_id) > 0)的请求。

因为我们LEFT JOINed,所有响应都被保留,读取或未读...所有读取行将包含b.request_id的NULL。 COUNT(*)基本上依赖于行的存在,因此它为我们提供了消息的总数。然后COUNT(b.request_id)为我们提供了未读消息的计数,因为它只会将非NULL值计入其计算中。

答案 1 :(得分:0)

尝试这样的事情:

SELECT COUNT(`res`.`response_id`) AS `total`, COUNT(`res`.`readflag`='0') AS `unread`
FROM `Requests` AS `req`
LEFT JOIN `Responses` AS `res` ON `req`.`request_id`=`res`.`request_id`
WHERE `unread`>1 AND `req`.`user_id`='[PLACE_USER_ID_HERE]'