2013-04-26 68 views
1

基于用户输入的记录我有三个表选择在MySQL

games (ga_id , game)

equipments (eq_id, equipment)

games_equipments (ga_id, eq_id)

ga_id参考游戏桌的那个ga_ideq_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和2 eq_id

  1. 如果我输入eq_id 1,将返回网球不仅是因为这是只使用单一设备1.虽然篮球和棒球都使用eq_id 1的比赛,但每个人都需要在其他设备为了被播放。所以篮球和棒球不应该退回
  2. 如果我输入eq_id 3将不会返回任何东西,因为虽然有一个游戏使用eq_id 3这是棒球,但它仍然需要eq_id 1才能玩。

请帮帮我。

回答

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) 

结果: enter image description here

然后格兰比编号,并计数一个数字编号(如此编号)

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 

enter image description here

然后使用具有关键字只保留游戏与一个设备公司,并把你的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 

结果: enter image description here

更换过滤器AND eq_id=3 - >空结果

对于很多设备ID查询是有点不同, 我试图做一个通用的,但没有fint出来,如果别人有一个想法?

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改变输入

+0

非常感谢您的帮助。你做得很好,详细解释了这个查询如何解决我的问题。 – user2322606 2013-04-30 15:26:09

+0

嗨Marcassin,如果我的输入是eq_id 1和2,并且预期回报应该是ga_id 1,那是篮球,那么应该怎样查询? – user2322606 2013-05-01 07:01:39

+0

@ user2322606刚编辑答案。找到一个通用的功能可能是一个很好的培训。 – Marcassin 2013-05-01 18:37:40