我有 4 张 table 。
- 表 A 有用户 - (
user_id, username, and name
) - 具有 token 的表 B - (
token_id, user_id
)。每个用户有 10 个 token 条目。每个 token 仅分配给一个用户。一个用户有多个 token (10) - 表 C 是街机游戏 - (
arcade_id, token_id, name, levels, lives
)。一个代币只能分配给一个街机游戏。 - 表 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/