1

mysql ベースのチャット アプリケーションを構築しています。

私のデータベーススキーマには次のテーブルがあります。

       Users               Messages
   =================   =================
        id                 id
        screen_name        message
                           from
                           to
                           timestamp

メッセージ テーブルの from フィールドと to フィールドには、各メッセージを送受信したユーザーの ID が含まれています。

ユーザー ($id) とその友人 ($friend) の間のすべてのメッセージを表示しようとしています。私のクエリは次のとおりです。

$query = "SELECT messages.* , users.screen_name FROM users CROSS JOIN messages ";
$query .= "ON ( messages.to = $id AND messages.from = $friend ) ";
$query .= "OR ( messages.to = $friend AND messages.from = $id )";

問題は、すべてのメッセージが結果テーブルに 2 回あることです。

DISTINCT を使用してみましたが、このシナリオでは機能しないか、間違って使用しました。

2 人のユーザー間で各メッセージを 1 回だけ受信するには、どのクエリを使用すればよいですか?

4

2 に答える 2

3

このような何かがうまくいくはずです:

SELECT
  messages.*,
  users_from.screen_name AS from_screen_name,
  users_to.screen_name AS to_screen_name
FROM
  messages
    JOIN users AS users_from ON messages.from = users_from.id
    JOIN users AS users_to ON messages.to = users_to.id
WHERE
  (messages.to = $id AND messages.from = $friend)
  OR ( messages.to = $friend AND messages.from = $id)

これが行うことは、「users」テーブルを 2 回結合することです。1 回目は「to」列で、2 回目は「from」列で結合します。

于 2012-04-10T13:31:52.630 に答える
1

@ Travesty3 は、キーワードがすべてのフィールドが別の行と等しいDISTINCT重複行のみを除外することを既に提案しています。したがって、キーワードはここに行く方法ではありません。DISTINCT

ただし、できることは、GROUP BY messages.idメッセージ ID ごとに 1 つの行だけを取得することです (ただし、2 つの行のどちらが除外されるかについての保証はありません)。

于 2012-04-10T13:45:14.167 に答える