我有三张桌子
games (ga_id , game)
,
equipments (eq_id, equipment)
,
games_equipments (ga_id, eq_id)
。
ga_id
引用游戏表的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来播放。请帮帮我。
答案 0 :(得分:0)
您应该加入您的表格并使用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)
结果:
然后使用地址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 CLAUSE(不在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)
和HAVING nb_eq =2
才能更改输入