我有三个表
游戏(ga_id,游戏)
,
设备(eq_id, equipment)
,
games_equipments (ga_id, eq_id)
。
ga_id
是指游戏 table 的ga_id
,eq_id
是指装备的eq_id
表。
该表有以下示例数据:
games table: (1,basketball) , (2, baseball), (3, tennis)
equipments table: (1, A) (2,B) (3,B)
games_equipments table: (1,1) (1,2) (2,1) (2,3) (3,1)
这些是我想做的事情: 1. 如果我输入 eq_id 1 和 2 将返回篮球,因为这是唯一同时使用 eq_id 1 和 eq_id 2 的游戏
- 如果我输入
eq_id
1 将仅返回网球,因为这是唯一使用唯一设备 1 的游戏。虽然篮球和棒球都使用eq_id
1,但每个需要其他设备才能播放。所以篮球和棒球不应该归还 - 如果我输入
eq_id
3 将不会返回任何内容,因为虽然有一款游戏使用 eq_id 3 是棒球,但它仍然需要eq_id
1 才能播放。
请帮帮我。
最佳答案
您应该加入您的表并使用 HAVING 关键字过滤结果:
SELECT games.game, COUNT(games.ga_id), ga_eq.eq_id FROM `games`
JOIN ga_eq USING (ga_id)
JOIN equipements USING (eq_id)
GROUP BY games.ga_id
HAVING COUNT(games.ga_id)=1 AND eq_id=1
方法如下: 获取所有行
SELECT games.game, ga_eq.eq_id FROM `games`
JOIN ga_eq USING (ga_id) JOIN equipements USING (eq_id)
结果:
然后 grouby ID 并计算一个数字 id(所以数字设备)
SELECT games.game, ga_eq.eq_id, COUNT(games.ga_id) FROM `games`
JOIN ga_eq USING (ga_id) JOIN equipements USING (eq_id)
GROUP BY games.ga_id
然后使用 HAVING 关键字只保留一台设备的游戏,并将您的 eq_id 过滤器放在 HAVING 子句中(而不是在 WHERE 子句中)
SELECT games.game, ga_eq.eq_id, COUNT(games.ga_id)
FROM `games` JOIN ga_eq USING (ga_id) JOIN equipements USING (eq_id)
GROUP BY games.ga_id HAVING COUNT(games.ga_id)=1 AND eq_id=1
结果:
更改过滤器 AND eq_id=3
-> 空结果
对于许多设备 id,查询有点不同, 我尝试制作一个通用但没有找到,如果其他人有想法?
SELECT g.game, equipements.eq_id, (
SELECT COUNT( eq_id ) FROM ga_eq
WHERE ga_id = g.ga_id
AND eq_id IN (1, 2)
) AS nb_eq
FROM `games` g
JOIN ga_eq USING ( ga_id )
JOIN equipements USING ( eq_id )
GROUP BY game
HAVING nb_eq =2
你必须改变 AND eq_id IN (1, 2)
AND HAVING nb_eq =2
来改变输入
关于mysql - 根据mysql中的用户输入选择记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16233220/