1

私はこのような単純なチャットデータベースを持っています:

id | from | to | message
---|------|----|-----------------
1  | 1    | 2  | hello
2  | 1    | 2  | are you there?
3  | 2    | 1  | yes I'm here!

また、名前を保持する2番目のテーブルがあります

`users`.`firstname` and `users`.`lastname`

2つを組み合わせようとしているので、チャットを取得するときに、両方の参加者の名前も知っています。私のクエリは現在次のようになっています。

SELECT 
  `messages`.*, 
  CONCAT(`users`.`firstname`, " ", `users`.`lastname`) as `nameFrom`     
FROM `messages`     
  INNER JOIN 
     `users` ON `messages`.`from` = `users`.`id`

正常に動作しますが、別の結合を追加しようとした場合は、を変更するだけmessagesです。frommessagestoエラーが発生します。

チャットログを取得するときに、各参加者の名前と名前を組み合わせるにはどうすればよいですか?

ありがとう

4

2 に答える 2

3

送信者と受信者の両方を取得しようとしているように見えますか?その場合、これはUsersテーブルを2回結合することで機能するはずです。

SELECT 
  `messages`.*, 
  CONCAT(u.`firstname`, " ", u.`lastname`) as `nameFrom`,
  CONCAT(u2.`firstname`, " ", u2.`lastname`) as `nameTo`
FROM `messages`     
  INNER JOIN 
     `users` u ON `messages`.`from` = u.`id`
  INNER JOIN 
     `users` u2 ON `messages`.`to` = u2.`id`
于 2013-03-25T12:57:54.373 に答える
3

同じテーブル名を持つテーブルを一意に識別するためにを指定する場合は、基本的にテーブルusersで2回テーブルを結合する必要があります。messagesALIAS

SELECT  messages.*, 
        CONCAT(a.firstname, ' ', a.lastname) as nameFrom,
        CONCAT(b.firstname, ' ', b.lastname) as nameTo  
FROM    messages     
        INNER JOIN users a
            ON messages.from = a.id
        INNER JOIN users b
            ON messages.to = b.id
于 2013-03-25T12:57:59.707 に答える