1

まず第一に、同様の質問がここで尋ねられていることを知っています。確認しましたが、私の問題に対する適切な解決策が見つかりませんでした.

これらの 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 テーブルの最低値を提供することを除いて、私が必要としているものを正確に示しています (推測します)。

これどうやってするの ?私はどこで間違っていますか?

ありがとう、

4

2 に答える 2

2

各会話の最新のメッセージを取得する別の方法を次に示します。

SELECT m.*, u.*, u2.*
FROM (`messages` AS m)
LEFT JOIN users AS u ON u.user_id=m.message_from
LEFT JOIN users AS u2 ON u2.user_id=m.message_to
WHERE (m.`message_from` != 1 AND m.`message_to` != 1) AND m.`message_id` IN (
    SELECT MAX(`message_id`) 
    FROM `messages` 
    GROUP BY `message_conversation_id` 
    HAVING `message_id` = m.`message_id`)
ORDER BY m.message_id DESC;

これを説明すると、結果は「Using where; Using index」であり、「ミッションが達成された」ことを意味します。

于 2012-06-26T18:14:42.320 に答える
0

この方法で必要なものを取得しました。必要なのはmessage_body結果列です。これは健康的ですか、それとも他の(おそらくより良い)方法はありますか?

SELECT DISTINCT(m.message_conversation_id),max(m.message_id), m.*,u.*, u2.*, 
(SELECT m2.message_text FROM messages m2 WHERE m2.message_id = max(m.message_id)) AS 'message_body'
FROM (`messages` AS m)
LEFT JOIN users AS u ON u.user_id=m.message_from
LEFT JOIN users AS u2 ON u2.user_id=m.message_to
WHERE (m.message_from='1' OR m.message_to='1')
GROUP BY m.message_conversation_id
ORDER BY m.message_id DESC
于 2012-06-26T17:18:44.557 に答える