如何强制查询只获取所有行的结果?

时间:2013-02-13 00:46:50

标签: mysql sql

嗯,这是一个非常简单的问题,所以我希望你能帮助我。

我有两个具有这种结构的表:

-- -----------------------------------------------------
-- Table `mydb`.`product`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`products` (
  `id_product` INT NOT NULL ,
  `name` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_product`) )
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Table `mydb`.`features`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`features` (
  `id_feature` INT NOT NULL ,
  `id_product` INT NOT NULL ,
  `description` VARCHAR(45) NOT NULL ,
  PRIMARY KEY (`id_feature`) ,
  INDEX `fk_table2_table1` (`id_product` ASC) ,
  CONSTRAINT `fk_table2_table1`
    FOREIGN KEY (`id_product` )
    REFERENCES `mydb`.`products` (`id_product` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

此查询返回产品5的所有功能:

select descripcion from features where id_product = 5;

是:

expensive
strong
tall

好的,现在我想得到表''产品'的所有名称只有所有这些功能。 我试过这样的事情:

select p.name from products p, features f
where p.id_product = f.id_product and
f.id_feature in 
(select id_feature from features 
where description in
(select description from features
where id_product = 5);

但它也让我回到了比我正在寻找的三个产品更少或更多功能的产品......

我希望我很清楚。 提前谢谢。

2 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是那些具有所有这三种功能而没有任何其他功能的产品。如果是这样,这样的事情应该有效:

SELECT P.Id_Product, P.Name
FROM Products P
    JOIN Features F ON P.id_product = F.id_product 
    JOIN Features F2 ON P.id_product = F2.id_product 
WHERE F.id_feature IN (SELECT id_feature FROM Features WHERE id_product = 5)
GROUP BY P.Id_Product, P.Name
HAVING COUNT(DISTINCT F2.id_Feature) = 3

这是一个简明的Fiddle来演示。

答案 1 :(得分:0)

我认为你想使用连接语句 - 我没有检查我的查询是否有确切的语法,但你明白了:

SELECT * FROM `mydb`.`products`

加入mydbfeatures ON mydbfeaturesid_product = mydbproducts。{{1} }

id_product