我有一个包含产品的数据库,特定的床位。每张床的详细信息都存储在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厘米。
答案 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