Php mysql连接表
我有四张桌子Php mysql连接表,php,mysql,database,database-design,Php,Mysql,Database,Database Design,我有四张桌子 表A包含用户-(用户id、用户名和名称) 表B中有令牌-(token\u id,user\u id)。每个用户有10个令牌条目。每个令牌仅分配给一个用户。一个用户有多个令牌(10) 表C为街机游戏-(街机id、令牌id、名称、级别、寿命)。只能为一个街机游戏分配一个令牌 表D为奖品-(奖品id、令牌id、名称、长度、宽度、高度)。只能将一个令牌分配给一个奖品 令牌分配给街机游戏或奖品,或不分配,但不能同时分配给两者 我的问题是如何设置一个MySQL连接查询,以确定给定用户的哪些令牌
用户id、用户名和名称
)token\u id,user\u id
)。每个用户有10个令牌条目。每个令牌仅分配给一个用户。一个用户有多个令牌(10)街机id、令牌id、名称、级别、寿命
)。只能为一个街机游戏分配一个令牌李>
奖品id、令牌id、名称、长度、宽度、高度
)。只能将一个令牌分配给一个奖品李>
令牌分配给街机游戏或奖品,或不分配,但不能同时分配给两者
我的问题是如何设置一个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查询字符串
选择****
从******
其中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
你能提供一些关于这方面的样本数据吗