1

メッセージを保持するテーブルとユーザーを保持するテーブルがあります。user_id 1 とやり取りした (メッセージを送受信した) すべてのユーザーを取得したい。このクエリは次のように機能します。

http://sqlfiddle.com/#!2/6a2f3/1

編集:

SELECT DISTINCT
    (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) `user_id`,
    users.*
FROM `messages`
INNER JOIN users 
ON (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) = users.user_id
WHERE `user_to_id` = 1 OR `user_from_id` = 1
ORDER BY `time` DESC

しかし、列を SELECT に追加すると、message重複したレコードが返されます。

http://sqlfiddle.com/#!2/6a2f3/2

編集:

SELECT DISTINCT
  (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) `user_id`,
  `messages`.`message`,
  users.*
FROM `messages`
INNER JOIN users 
ON (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) = users.user_id
WHERE `user_to_id` = 1 OR `user_from_id` = 1
ORDER BY `time` DESC

どうすれば修正できますか?

また、「DISTINCT」の選択が行われた後に結果を並べ替えていることがわかります。message_id2の行には 3 があるため、最初のクエリは結果を反転して返す必要timeがあります。「DISTINCT」の前に並べ替える方法はありますか?

編集 2: 質問について明確ではありませんでした。一致した user_id の最後のメッセージのみを選択したい。

4

2 に答える 2

0

このようなものが欲しいですか?

SELECT *
FROM (
  SELECT 
    users.*,
    (SELECT `message` from messages 
     WHERE 
    (CASE WHEN `user_to_id` = 1 THEN `user_from_id` ELSE `user_to_id` END) = users.user_id
     AND (`user_to_id` = 1 OR `user_from_id` = 1)
     ORDER BY `time` DESC limit 1
     ) AS message
  FROM users
) a 
WHERE message IS NOT NULL

SQL フィドル

于 2013-09-10T15:09:45.867 に答える