0

最初のテーブルの参照IDが2番目のテーブルの値に置き換えられるように、選択を作成したい2つのテーブルがあります。巨大なデータベースに対して最適化されたクエリが推奨されます。以下は私の目標を示しています。

TABLE_KINGDOMS
==============
kid     kingdom      id_king      id_queen      id_prince      id_princess
--      -------      -------      --------      ---------      -----------
1       red          1            2             3              4
2       blue         5            6             7              8
...

TABLE_PLAYERS
=============
pid     username      points      gold
--      --------      ------      ----
1       Jack          34789       35667
2       Jill          2312        23887
3       Walt          8756        23112
4       Winnie        587         255
5       Eric          76521       34678
6       Alice         6799        7549
7       Ned           5565        9009
8       Rose          2312        3429
...

DESIRED_SELECTION (Replace id with username)
=================
kid     kingdom      king      queen      prince      princess
--      -------      ----      -----      ------      --------
1       red          Jack      Jill       Walt        Winnie
2       blue         Eric      Alice      Ned         Rose
...

次のことを試しましたが、機能しません。

SELECT *
FROM table_kingdoms
LEFT JOIN table_users ON id_king = tu.id
LEFT JOIN table_users ON id_queen = tu.id
LEFT JOIN table_users ON id_prince = tu.id
LEFT JOIN table_users ON id_princess = tu.id

ありがとう!

4

2 に答える 2

3

結合されたテーブルに異なるエイリアスを指定するだけです。

SELECT k.kid, k.kingdom,
   uk.username AS king,
   uq.username AS queen,
   up.username AS prince
   ups.username AS princess
FROM table_kingdoms k
LEFT JOIN table_users uk ON k.id_king = uk.pid
LEFT JOIN table_users uq ON k.id_queen = uq.pid
LEFT JOIN table_users up ON k.id_prince = up.pid
LEFT JOIN table_users ups ON k.id_princess = ups.pid;

また、フィールドは不可であるLEFT JOINと想定しているため、省略できます。id_...NULL

于 2012-06-19T14:11:41.953 に答える
2

table_kingdomsLEFT JOINSINNERIDはいずれLEFTもnullではないため、IDをnullにできる場合は元に戻します。それ以外の場合INNERは、より適切です。クエリの列とテーブルの名前が構造にあるものと異なるため、どちらを使用すればよいかわかりませんでした。したがって、これで必要なものが得られない場合は、意味が機能しないことを指定してください。特定の問題に対処できます。

SELECT K.kid,K.Kingdom, P.Username as King,PQ.Username as Queen,
PP.Username as Prince,PS.Username as Princess
FROM table_kingdoms K
INNER JOIN TABLE_PLAYERS PK ON K.id_king = PK.pid --replace TABLE_PLAYERS  with table_users depending on the actual table name
--LEFT JOIN table_users ON id_king = tu.id REPLACE WITH ABOVE
INNER JOIN TABLE_PLAYERS PQ ON K.id_queen = PQ.pid --replace TABLE_PLAYERS  with table_users depending on the actual table name
--LEFT JOIN table_users ON id_queen = tu.id  REPLACE WITH ABOVE
INNER JOIN TABLE_PLAYERS PP ON K.id_prince = PP.pid --replace TABLE_PLAYERS  with table_users depending on the actual table name
--LEFT JOIN table_users ON id_prince = tu.id  REPLACE WITH ABOVE
INNER JOIN TABLE_PLAYERS PS ON K.id_princess = PS.pid --replace TABLE_PLAYERS  with table_users depending on the actual table name
--LEFT JOIN table_users ON id_princess = tu.id  REPLACE WITH ABOVE

元のクエリに関する限り、かなり近いです。最大のことは、tu.idと言っているが、エイリアスとして宣言したことがなく、同じエイリアスを再利用できないことです。また、列を希望どおりに定義する必要がありますが、これはエラーではありません。これは、実際のエラーである上記の内容の編集です。

SELECT *
FROM table_kingdoms
LEFT JOIN table_users tu ON id_king = tu.id
LEFT JOIN table_users  tu2 ON id_queen = tu2.id
LEFT JOIN table_users tu3 ON id_prince = tu3.id
LEFT JOIN table_users  tu4 ON id_princess = tu4.id

また、メモとして、私は個人的にtable_kingdomsのエイリアスも作成します。ここでは、列の表示も含まれています。

SELECT K.kid,K.Kingdom, tu.Username as King, tu2.Username as Queen,
tu3.Username as Prince,tu4.Username as Princess
FROM table_kingdoms k
LEFT JOIN table_users tu ON k.id_king = tu.id
LEFT JOIN table_users  tu2 ON k.id_queen = tu2.id
LEFT JOIN table_users tu3 ON k.id_prince = tu3.id
LEFT JOIN table_users  tu4 ON k.id_princess = tu4.id
于 2012-06-19T14:18:15.060 に答える