1

我有一个数据库,其中包含特定的产品和床。每张床的详细信息都存储在一个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;

如果用户选择 90cm 和 120cm,查询的简单英文解释将是:

products表格中选择所有可能有90 厘米或 120 厘米sizeproduct_bedding_sizes表格。

4

1 回答 1

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
于 2013-01-26T20:18:46.897 回答