按MySQL中的条件过滤产品记录

时间:2013-01-26 20:07:46

标签: mysql relational-database

我有一个包含产品的数据库,特定的床位。每张床的详细信息都存储在products表中,但后来我有一张单独的表product_bedding_sizes,其中包含了床的每种尺寸的记录。因此,一张床可能在此表中有五个条目(这是一对多的关系)。

那一点已经完成。但是,在公共网站上,访问者可以搜索产品并将搜索限制在特定的床位。所以我的问题是,如何选择一系列尺寸并选择所有可能有一个或多个指定尺寸的床品?

简化架构:

CREATE TABLE `products` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB;

CREATE TABLE `product_bedding_sizes` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `product_id` int(10) unsigned NOT NULL,
  `size` int(10) unsigned NOT NULL,
  PRIMARY KEY (`id`),
  KEY `product_id` (`product_id`)
) ENGINE=InnoDB;

ALTER TABLE `product_bedding_sizes`
  ADD CONSTRAINT `product_bedding_sizes_ibfk_1`
    FOREIGN KEY (`product_id`)
    REFERENCES `products` (`id`)
    ON DELETE CASCADE
    ON UPDATE CASCADE;

如果用户选择说,90厘米和120厘米,查询的简单英语解释将是:

  

products表格中选择所有size表格中product_bedding_sizes的所有内容,该表格的长度为90厘米或120厘米。

1 个答案:

答案 0 :(得分:0)

如果产品的尺寸为90或尺寸为120,或两者兼而有之,我认为应该返回一行。 (查询与返回产品大小为90且大小为120的行略有不同。)

任何这些查询都会返回指定的结果:

SELECT p.id
     , p.name
  FROM products p
  JOIN product_bedding_sizes s
    ON s.product_id = p.id
   AND s.size IN (90,120)
 GROUP
    BY p.id
     , p.name

- 或 -

SELECT p.id
     , p.name
  FROM products p
  JOIN ( SELECT s.product_id
           FROM product_bedding_sizes s
          WHERE s.size IN (90,120)
          GROUP BY s.product_id
       ) t
    ON t.product_id = p.id
 ORDER
    BY p.id
     , p.name

- 或 -

SELECT p.id
     , p.name
  FROM products p
 WHERE EXISTS
       ( SELECT 1
           FROM product_beddings_sizes s
          WHERE s.product_id = p.id
            AND s.size IN (90,120)
       )
 ORDER
    BY p.id
     , p.name

- 或 -

SELECT p.id
     , p.name
  FROM products p 
 WHERE p.id IN
       ( SELECT s.product_id
           FROM product_bedding_sizes s
          WHERE s.size IN (90,120)
       )
 ORDER
    BY p.id
     , p.name