0

メッセージを含むデータベースがあります。メッセージは 1 つのテーブルに格納され、ユーザー情報は別のテーブルに格納されます。メッセージ テーブルには、user テーブルの作成者の user_id を表す author_id 列があり、すべてのメッセージ列があり、"u_" + user_id の連結を表す to_address が user テーブルからあります。これらの 2 つのテーブルを結合して、author_id と to_address の両方で ID の代わりにユーザー名を表示できるものはありますか。

私はもう試した

SELECT  username, ..., username
  FROM msgs
    INNER JOIN users
      ON user_id=author_id AND concat("u_",user_id)=to_address;

明らかなエラーで、次のようなサブクエリを使用してみました

SELECT
  ( SELECT username 
      FROM users
        INNER JOIN msgs
          ON user_id=author_id
  ) AS "From",
  ( SELECT username
      FROM users
        INNER JOIN msgs
          ON CONCAT("u_",user_id)=to_address
  ) AS "To",
  ( SELECT timestamp(message_time) FROM msgs
  ) AS "Sent",
  ( SELECT message_subject FROM msgs
  ) AS "Subject",
  ( SELECT message_text AS "Message" FROM msgs
  ) AS "Message"

「サブクエリは複数の行を返します」を取得しました。これを成功させる方法はありますか?

4

4 に答える 4

1

次のようなものが必要なようです。

SELECT
    from_user.username AS "From",
    to_user.username AS "To",
    timestamp(msgs.message_time) AS "Sent",
    msgs.message_subject AS "Subject",
    msgs.message_text AS "Message"

FROM msgs

INNER JOIN users AS from_user
ON msgs.author_id = from_user.user_id

INNER JOIN users AS to_user
ON msgs.to_address = CONCAT("u_", to_user.user_id);

基本的に、usersテーブルをテーブルにmsgs2回結合し、テーブルの各インスタンスに異なる名前と異なる結合条件を与えます。次に、テーブルの特定のインスタンスから特定の列を選択できusersます。

于 2012-07-19T19:24:11.020 に答える
0

あなたは次のようなことをしたいと思います

SELECT msgs.*,
       authors.whatever,
       addresses.to_address
  FROM msgs
  JOIN users AS authors ON msgs.author_id = authors.id
  JOIN users AS addresses ON msgs.address_id = addresses.id

私のクエリはおそらく不正確ですが、ここで何をしているのかわかるでしょう。

余談ですが、メッセージを省略せず、単一のテーブル名を使用することをお勧めします。

于 2012-07-19T19:26:38.993 に答える
0

2 人の別々のユーザーを取得するため、2 つの結合が必要です。

select f.username, t.username
from msgs m
inner join users f on f.user_id = m.author_id
inner join users t on concat("u_", t.user_id) = m.to_address
于 2012-07-19T19:28:51.753 に答える
0

これにより、JOIN を使用する代わりに、相関サブクエリを使用して、「author_id」と「to_address」の両方に関連付けられたユーザー名が返されます。(JOIN を使用するのが通常のアプローチですが、相関サブクエリを使用するアプローチにより、柔軟性がさらに高まります。

SELECT (SELECT u.username 
          FROM users u 
            ON u.user_id = CONCAT("u_",u.user_id) = m.to_address
         ORDER BY u.username LIMIT 1
       ) AS to_username
     , (SELECT a.username 
          FROM users a 
            ON a.user_id = m.author_id
           ORDER BY a.username LIMIT 1
       ) AS author_username
     , m.*
  FROM msgs m

注: これは、to_address または author_id に一致するユーザー名が見つからない場合に msg から行を返すという点で、INNER JOIN とは少し異なります。)

注: これは、user_id が users テーブルで一意であることを前提としています。

注: ユーザー テーブルのユーザー名列が NOT NULL の場合、INNER JOIN をエミュレートできます。

HAVING to_username IS NOT NULL
   AND author_username IS NOT NULL
于 2012-07-19T19:40:04.220 に答える