3

私は4つのテーブルを持っています。

  1. ユーザーを含むテーブル A - ( user_id, username, and name)
  2. トークンを持つテーブル B - ( token_id, user_id)。各ユーザーには 10 個のトークン エントリがあります。各トークンは 1 人のユーザーにのみ割り当てられます。ユーザーは複数のトークンを持っています (10)
  3. アーケード ゲームである表 C - ( arcade_id, token_id, name, levels, lives)。1 つのアーケード ゲームにのみ、1 つのトークンのみを割り当てることができます。
  4. 賞品である表 D - ( prize_id, token_id, name, length, width, height)。1 つの賞品に割り当てることができるトークンは 1 つだけです。

トークンは、アーケード ゲームまたは賞品のいずれかに割り当てられるか、または両方には割り当てられません。

私の質問は、特定のユーザーのどのトークンがゲームまたは賞品に割り当てられているか、まだ割り当てられていないかを把握するために、MySQL 結合クエリをどのように設定するかです。テーブルのレイアウトは最適ですか? または、別のレイアウトの提案はありますか?

ここに私のテーブルがあります:

mysql> select * from users;

+---------+--------+
| user_id | name   |
+---------+--------+
|       1 | User 1 |
|       2 | User 2 |
|       3 | User 3 |
|       4 | User 4 |
+---------+--------+

mysql> select * from tokens;

+----------+---------+
| token_id | user_id |
+----------+---------+
|        1 |       1 |
|        2 |       1 |
|        3 |       2 |
|        4 |       2 |
|        5 |       2 |
|       11 |       2 |
|        6 |       3 |
|        7 |       3 |
|       10 |       3 |
|        8 |       4 |
|        9 |       4 |
+----------+---------+

mysql> select * from prizes;

+----------+----------+-----------+
| prize_id | token_id | prizename |
+----------+----------+-----------+
|        1 |        4 | prize 1   |
|        2 |        7 | prize 2   |
|        3 |        8 | prize 3   |
|        4 |        9 | prize 4   |
+----------+----------+-----------+

mysql> select * from arcade;

+-----------+----------+----------+
| arcade_id | token_id | gamename |
+-----------+----------+----------+
|         1 |        1 | game 1   |
|         2 |        2 | game 2   |
|         3 |        3 | game 3   |
|         4 |        5 | game 4   |
|         5 |       11 | game 6   |
+-----------+----------+----------+

次の情報を取得できる SQL クエリが必要です。

ユーザー 1 には 2 つのトークンがあります。トークン ID 1 はゲーム 1 に割り当てられ、トークン ID 2 はゲーム 2 に割り当てられます。

または、ユーザー 2 の場合 - 彼らは 4 つのトークンを持っています - トークン ID 3 はゲーム 3 に割り当てられ、トークン ID 4 は賞品 1 に割り当てられ、トークン ID 5 はゲーム 4 に割り当てられます。

または、ユーザー 3 の場合 - 彼らは 3 つのトークンを持っています - トークン ID 6 はまだ割り当てられておらず、トークン ID 7 は賞品 2 であり、トークン ID 10 は割り当てられていません

等々。

このようなMySQLクエリ文字列を作成したいと思います

Select **** 
  from ***** 
 Where user_id = 1

ユーザーIDを指定して、上記のすべての情報を取得する場所。

4

1 に答える 1

1

このクエリを試してみてください。ただし、ダミーデータでチェックしましたが、データがあればチェックできます

select
  t.token_id,
  IFNULL(g.game,'') as Game,
  IFNULL(p.name,'') as Prize,
  case when g.game != '' then 'Assigned' when p.name != '' then 'Assigned' else 'Not assigned yet' end as `Status`
from token as t
  left join (select *
         from games
         where token_id not in(select
                     token_id
                   from prize)) as g
    on g.token_id = t.token_id
  left join (select *
         from prize
         where token_id not in(select
                     token_id
                   from games)) as p
    on p.token_id = t.token_id

EDITED
その後、それは最も簡単なことでなければなりません

select *
from `user`
  left join token
    on user.user_id = token.user_id
  left join games
    on games.token_id = token.token_id
  left join prize
    on prize.token_id = token.token_id
where user.user_id = 1
于 2012-07-02T05:54:57.733 に答える