3

我有 4 张桌子。

  1. 具有用户的表 A - ( user_id, username, and name)
  2. 具有标记的表 B - ( token_id, user_id)。每个用户有 10 个令牌条目。每个令牌仅分配给一个用户。一个用户有多个令牌 (10)
  3. 表 C 即街机游戏 - ( arcade_id, token_id, name, levels, lives)。一个代币只能分配给一个街机游戏。
  4. 表 D 即奖品 - ( prize_id, token_id, name, length, width, height)。一个奖品只能分配一个代币。

代币被分配给街机游戏或奖品或什么都没有,但不能同时分配给两者。

我的问题是如何设置 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 回答