0

3 つの 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 つのレスポンスが未読であるユーザーのすべてのリクエスト、合計レスポンス数、およびこのリクエストに対する未読レスポンス数を取得したいと考えています。

4

2 に答える 2

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

ここでは、リレーションシップの Responses テーブルとメッセージが未読の場所 ( b.readflag = 0) を LEFT JOIN します。これにより、読み取り応答を含むすべての行が に対して NULL 値を持つようになりますb.response_id。は計算に NULL を考慮しないためCOUNT()、少なくとも 1 つの未読応答がある要求のみをフィルタリングします ( HAVING COUNT(b.request_id) > 0)。

LEFT JOIN したため、すべての応答が保持され、読み取られているか、読み取られていないか... のすべての読み取り行に NULL が含まれますb.request_idCOUNT(*)基本的に行の存在をカウントするため、メッセージの合計数が得られます。次にCOUNT(b.request_id)、非 NULL 値のみが計算に考慮されるため、未読メッセージの数が得られます。

于 2012-06-10T18:04:06.437 に答える
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]'
于 2012-06-10T16:41:30.723 に答える