0

最初のテーブルの 2 つのフィールドのいずれかが 2 番目のテーブルのキーである別のテーブルにテーブルを結合したいと考えています。

2 番目のテーブルには、最初のテーブルのいずれかのフィールドで一致した場合に取得したい追加情報が含まれています。

テーブルネットワーク

id | inviter | invitee | status

テーブルのユーザー情報

id | userid | name

2番目のテーブルにアクセスしていない場合のクエリ

"SELECT * from network where inviter= '22' OR invitee ='22'"

次のようなものだと思いますが、構文がわかりません。

"SELECT n.*,u.* from `network`, n
left join `users`, u on
n.inviter = u.id OR n.invitee= u.id
WHERE n.inviter = '22' or n.invitee= '22'"

ご提案いただきありがとうございます。

4

2 に答える 2

1

aテーブルとそのエイリアスまたはu(オプションでASキーワードを使用する)の間にコンマを入れたくないことを除いて、構文はほぼ正しいですがuserinfo、招待者と招待者に異なるデータが必要なため、2 番目の結合が必要です。

SELECT
  /* Use column aliases to distinguish inviter/invitee details */
  n.id AS n_id,
  n.status,
  inviter.userid AS inviter_userid,
  inviter.name AS inviter_name,
  invitee.userid AS invitee_userid,
  invitee.name AS invitee_name
FROM
  network AS n
  /* JOIN against `userinfo` twice: once to get inviter, once for invitee */
  /* aliased as inviter/invitee */
  LEFT JOIN userinfo AS inviter ON n.inviter = inviter.userid
  LEFT JOIN userinfo AS invitee ON n.invitee = invitee.userid
WHERE 
  n.inviter = 22
  OR n.invitee = 22

アップデート:

一致するこれらのいずれかのみを返すには、ステートメントで変更して、句CASEの値と同じものを特定できます。WHERE

SELECT
  /* Use column aliases to distinguish inviter/invitee details */
  n.id AS n_id,
  n.status,
  /* Return only one name, whichever matches the same value as in WHERE */
  CASE 
    WHEN inviter.userid = 22 THEN inviter.name
    WHEN invitee.userid = 22 THEN invitee.name
  END AS name
FROM
  network AS n
  /* JOIN against `userinfo` twice: once to get inviter, once for invitee */
  /* aliased as inviter/invitee */
  LEFT JOIN userinfo AS inviter ON n.inviter = inviter.userid
  LEFT JOIN userinfo AS invitee ON n.invitee = invitee.userid
WHERE 
  n.inviter = 22
  OR n.invitee = 22

更新 2:

よくよく考えてみると、必要なのは既に知っている ID の名前 (22) だけである場合、2 つの結合は必要ありません。サブクエリで引き続き使用する必要がありますがCASE、ID を返すだけで済みます。

SELECT
  n.*,
  u.*
FROM (
  SELECT
    id AS n_id,
    status,
    CASE 
      WHEN inviter = 22 THEN inviter 
      WHEN invitee = 22 THEN invitee 
    END AS i_id
  FROM network
  WHERE inviter = 22 OR invitee = 22
) n JOIN userinfo u ON n.i_id = userinfo.userid
于 2012-07-31T18:22:33.090 に答える
0

これを試して:

SELECT a.inviter, a.invitee, a.status,b.userid, b.name FROM network a INNER JOIN userinfo b ON a.id = '22' AND b.id = '22';

結合に複数のキーを使用するには、次のことを試してください。

SELECT SELECT a.inviter, a.invitee, a.status,b.userid, b.name FROM network a INNER JOIN userinfo b ON a.invitee = '22' AND b.userid = '22' OR a.inviter = '22' AND b.userid ='22';
于 2012-07-31T18:20:13.567 に答える