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