1

我有三张桌子

games (ga_id , game),

equipments (eq_id, equipment),

games_equipments (ga_id, eq_id).

ga_id参考ga_id游戏表的参考eq_ideq_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 的游戏

  1. 如果我输入eq_id1,那将只返回网球,因为那是唯一使用唯一设备 1 的游戏。虽然篮球和棒球都使用eq_id1,但都需要其他设备才能玩。所以篮球和棒球不应该被退回
  2. 如果我输入eq_id3 将不会返回任何内容,因为虽然有一个使用 eq_id 3 的游戏是棒球,但它仍然需要eq_id1 才能播放。

请帮我。

4

1 回答 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) 

结果 : 在此处输入图像描述

然后 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 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)ANDHAVING nb_eq =2才能更改输入

于 2013-04-26T12:55:23.380 回答