如何选择满足同一列中两个条件的项目

时间:2013-05-24 15:06:18

标签: mysql

我有一些包含车辆信息的表格,需要选择所有型号都有燃气的变体(版本)和柴油燃料的版本,即排除所有型号都以燃气为燃料或所有型号都加油的车型通过柴油。

我的设置就像这样(只有相关信息):

表模型(主键model_id)

model_id    model
   1         a model
   2         b model
   3         c model
   4         d model

表版本(主键version_id,model_id和engine_id外键)

version_id    model_id     engine_id
   1            1             1
   2            1             2
   3            2             1
   4            2             3
   5            3             2
   6            4             3
   7            3             4
   8            4             5

表引擎(主键= engine_id)

 engine_id      fuel
      1          gas
      2          diesel
      3          gas
      4          diesel
      5          diesel

我正在寻找一个可以给我模型1和4的查询,因为它们都有燃气和柴油版本,而不是2和3版本只有一种类型的燃料。

非常感谢!

2 个答案:

答案 0 :(得分:2)

此问题称为Relation Division,这是一种方法:

SELECT 
  m.model_id,
  m.model
FROM models         As m
INNER JOIN versions AS v ON m.model_id  = v.model_id
INNER JOIN engines  AS e ON e.engine_id = v.engine_id
WHERE e.fuel IN('gas', 'diesel')
GROUP BY m.model_id, 
         m.model
HAVING COUNT(DISTINCT e.fuel) = 2

HAVING COUNT(DISTINCT e.fuel) = 2将确保所选模型同时具有两种燃料。

请在此处查看:

这会给你:

| MODEL_ID |   MODEL |
----------------------
|        1 | a model |
|        4 | d model |

答案 1 :(得分:2)

我没有对此进行测试,但您可以执行以下操作:

select model_id, model from models m where 
exists (select 1 from versions v, engines e where m.model_id = v.model_id and e.engine_id = v.engine_id and e.fuel = 'gas') and 
exists (select 1 from versions v, engines e where m.model_id = v.model_id and e.engine_id = v.engine_id and e.fuel = 'diesel')

编辑:我用Mahmoud Gamal提供的sql小提琴测试了它,它确实有效:)