php - mysql连接表

标签 php mysql database database-design

我有 4 张 table 。

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

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

我的问题是如何设置 MySQL 连接查询来确定给定用户的哪些 token 已分配给游戏或奖品或尚未分配。我的 table 布局是否最佳?或者您对其他布局有什么建议吗?

这是我的表格:

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 个 token - token id 1 分配给游戏 1, token 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 并获取上述所有信息。

最佳答案

尝试这个查询,但如果有一些数据我将能够检查,尽管我已经检查了虚拟数据

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

已编辑
那么应该是最简单的事情了

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

关于php - mysql连接表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11287770/

相关文章:

相当于 python 的三引号的 PHP - 如何在不转义的情况下在 PHP 中打印大量/大量的 HTML

java - 二维码和扫描仪,Android ?

mysql - 在两个数据库中拥有表是否会造成性能损失

javascript - POST <target url> 419 (unknown status) - 无法在 Laravel 中发布数据

未使用偏移量的 PHP 数组内存消耗

mysql - MySQL 中的这个 group by 查询有什么问题?

mysql - 搜索包含多个值的字段

SQL 数据库结构。正常化?

php - CodeIgniter 不调用 js 文件

mysql - Pentaho 将唯一记录导入数据库