最新のメッセージを返さないように "グループ化"と "順序付け"を解決するにはmysqlクエリが必要です

CREATE TABLE `messages` (
  `message_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `message_project_id` int(7) unsigned NOT NULL DEFAULT '0',
  `message_time` int(11) unsigned NOT NULL DEFAULT '0',
  `message_from_user_id` int(7) unsigned NOT NULL DEFAULT '0',
  `message_to_user_id` int(7) unsigned NOT NULL DEFAULT '0',
  `message_details` text COLLATE utf8_unicode_ci NOT NULL,
  PRIMARY KEY (`message_id`)
)


CREATE TABLE `project` (
  `project_id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `project_user_id` int(7) unsigned NOT NULL DEFAULT '0',
  `project_name` varchar(255) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
  `project_status` varchar(50) COLLATE utf8_unicode_ci NOT NULL DEFAULT '',
 PRIMARY KEY (`project_id`)
) 

捕捉しようとしているのは、各プロジェクトのユーザー#2に対する最新のメッセージです。

ユーザー#2はプロジェクトの所有者であり、多くの関係者からメッセージを受け取ることができます。

実際のページには、ユーザー#2の「To Do」のリストが表示されます。ユーザー#2がメッセージを受信したがまだ送信していない、現在開いているプロジェクトのメッセージを探したい

したがって、ユーザ#1がユーザ#2にメッセージを送信した場合、メッセージテーブルに行が存在する

message_id | project_id | message_time | message_from_user_id | message_to_user_id | message_details
30 | 12 | 1304707966 | 1 | 2 | Hello user number two, thank you for your interest in my project
31 | 12 | 1304707970 | 2 | 1 | Hello user number one, Your project looks interesting
32 | 12 | 1304707975 | 3 | 1 | Hello user number one, here is my first message, im user number three.  I want to do your project
32 | 13 | 1304707975 | 7 | 1 | Hello user number one, here is my first message, im user number seven.  I want to do your other project

私はこれまでに試したことがあるが、かなり仕事をしていない: //これは、各プロジェクトの最新のメッセージを取得しますが、ユーザーごとに分離することはありません

SELECT cur.*, p.*
FROM messages cur
LEFT JOIN messages next ON cur.message_project_id = next.message_project_id AND cur.message_time < next.message_time
LEFT JOIN project p ON p.project_id = cur.message_project_id
WHERE next.message_time IS NULL
AND (cur.message_from_user_id = 2 OR cur.message_to_user_id = 2)
AND (p.project_status LIKE 'open' OR p.project_status LIKE 'started')
AND p.project_user_id = 2
ORDER BY cur.message_time DESC 

//これはユーザーごとに区切りますが、最新のメッセージテキストは返しません

SELECT *
FROM messages m
LEFT JOIN project p ON p.project_id = m.message_project_id
WHERE (message_from_user_id = 2 OR message_to_user_id = 2 )
AND (p.project_status LIKE 'open' OR p.project_status LIKE 'started')
AND p.project_user_id = 2
GROUP BY project_id
ORDER BY message_time DESC 

データがPHPに戻ったら、最新のメッセージがTOユーザー#2であるかどうかを確認し、そうであれば彼の画面に「あなたは返信が必要です」というメッセージを投稿します。

2
解明のための質問...ユーザー#1、#3、#5、#6のすべてがコメントを送信するが、ユーザー#1と#6だけが応答を受け取る(ユーザー#2が所有する)単一プロジェクトの場合...ユーザー#3と#5から送信された残りのエントリの両方がリストに表示されますか?特にユーザー#2がプロジェクトの最後のエントリとして#6への応答を送信し、その結果、自分自身からのプロジェクトの最後のエントリが送信された場合。
追加された 著者 DRapp,

2 答え

あなたのケースの大部分をカバーするサンプル出力を与えていればおそらく助けになるでしょう。あなたのコメントから判断して、何度か読んだ後、私はこれがあなたが探しているものと思います。

SELECT
    
FROM
    Messages M
INNER JOIN Projects P ON
    P.project_id = M.message_project_id AND
    P.project_status IN ('open', 'started') AND
    P.project_user_id = 2
WHERE
    M.message_to_user_id = 2 AND
    NOT EXISTS (
        SELECT *
        FROM Messages M2
        WHERE
            M2.message_from_user_id = 2 AND
            M2.message_project_id = M.message_project_id AND
            M2.message_to_user_id = M.message_from_user_id AND
            M2.message_time >= M.message_time
    )

これにより、ユーザーがそのプロジェクトの送信者にメッセージを送り返していないすべてのプロジェクトのすべてのメッセージが表示されます。もちろん、 ORDER BY を追加することもできます。

1
追加された
私が助けることができてうれしい
追加された 著者 Tom H,
うわー、私は驚いています。私は3つのクエリとforeachループを使用して a ソリューションを見つけることができました。あなたは1つのクエリでそれを行いました。あなたのソリューションはずっと良いです。素晴らしい、完璧!
追加された 著者 ussher,

これは機能しますか?

SELECT *
FROM messages m
LEFT JOIN project p ON (p.project_id = m.message_project_id)
WHERE (m.message_from_user_id = 211 OR m.message_to_user_id = 211 )
AND p.project_status IN('open','started') AND p.project_user_id = 2
GROUP BY p.project_id
ORDER BY m.message_time DESC 

それが役に立てば幸い

0
追加された
はい、動作しますが、同じ結果が得られます:AND(p.project_status LIKE 'open' OR p.project_status LIKE 'started')ので、各プロジェクトの最新のコメントを返します。ユーザー#1とユーザー#3からの新しいメッセージがある場合は、最新のメッセージのみが表示されます。 (申し訳ありませんが、私のコピー+貼り間違いは、上記の例では固定されています。
追加された 著者 ussher,
PHP - 日本のコミュニティ [ja]
PHP - 日本のコミュニティ [ja]
4 参加者の

このグループではPHPについて話します。 パートナー:kotaeta.com