まず第一に、同様の質問がここで尋ねられていることを知っています。確認しましたが、私の問題に対する適切な解決策が見つかりませんでした.
これらの 2 つのテーブルがあります (簡単にするために必要な部分のみをトリミングしています)。
CREATE TABLE messages(
message_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
message_conversation_id MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
message_from MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
message_to MEDIUMINT(8) UNSIGNED NOT NULL DEFAULT '0',
message_text TEXT NOT NULL DEFAULT '',
PRIMARY KEY (message_id),
KEY message_conversation_id (message_conversation_id),
KEY message_from (message_from),
KEY message_to (message_to)
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE users (
user_id MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
user_name VARCHAR(400) NOT NULL DEFAULT '',
PRIMARY KEY (user_id)
) ENGINE=INNODB DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
最大の message_id の message_text とユーザーの情報 (message_from または message_to の両方に保存され、where 句でフィルター処理される可能性があります) を表示するクエリを作成したい (単純に: メッセージが私に届き、他のユーザーのユーザー情報を提供します。その会話では、最後のメッセージが私または会話中の他の人の両方からのものである可能性があるためです)(これにより、解決に行き詰まりました))。
このクエリは、これまでに思いついたものです。
SELECT `m`.*, `u`.*, `u2`.*
FROM (`messages` AS m)
INNER JOIN `users` AS u ON `u`.`user_id`=`m`.`message_from`
INNER JOIN `users` AS u2 ON `u2`.`user_id`=`m`.`message_to`
WHERE (m.message_from="1" OR m.message_to="1")
AND `u`.`user_id` != '1'
AND `u2`.`user_id` != '1'
GROUP BY `m`.`message_conversation_id`
ORDER BY `m`.`message_id` desc
このクエリは、messages テーブルの最低値を提供することを除いて、私が必要としているものを正確に示しています (推測します)。
これどうやってするの ?私はどこで間違っていますか?
ありがとう、