我有一个要写的查询,我绝对不知道如何去做。这是我的情况,我试图提供一个特定的product_ID,然后匹配数据库中至少与提供的product_ID具有相同intDescription_detail_IDs的所有其他product_ID。
相关表格如下:
tblproducts
=========================
product_ID | product_name
=========================
| 1 | dresser |
| 2 | bookcase |
| 3 | table |
| 4 | chair |
=========================
tbldescriptions
=========================================================================
|description_ID| intDescription_product_ID | intDescription_detail_ID |
=========================================================================
| 1 | 1 | 1 |
| 2 | 1 | 2 |
| 4 | 2 | 1 |
| 5 | 2 | 2 |
| 6 | 2 | 6 |
| 7 | 3 | 1 |
| 8 | 3 | 3 |
| 9 | 3 | 4 |
| 10 | 4 | 1 |
| 11 | 4 | 2 |
| 12 | 4 | 7 |
例如,如果我提供了product_ID“1”,那么我想返回至少具有intDescription_detail_ID 1和2的所有product_ID。
因此,应返回的product_ID为1,2和4,因为所有这些产品的详细信息中的intDescription_detail_ID为1和2。
我对如何编写这样的查询非常困惑,所以非常感谢任何帮助!
答案 0 :(得分:1)
我应该警告你,我可能在这里犯了一个愚蠢的错误......
DROP TABLE IF EXISTS products;
CREATE TABLE products(product_ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,product_name VARCHAR(20) NOT NULL UNIQUE);
INSERT INTO products VALUES
(1,'dresser'),
(2,'bookcase'),
(3,'table'),
(4,'chair');
DROP TABLE IF EXISTS product_detail;
CREATE TABLE product_detail
(product_id INT NOT NULL
,detail_id INT NOT NULL
,PRIMARY KEY(product_id,detail_id)
);
INSERT INTO product_detail VALUES
(1,1),
(1,2),
(2,1),
(2,2),
(2,6),
(3,1),
(3,3),
(3,4),
(4,1),
(4,2),
(4,7);
SELECT DISTINCT c.product_id
FROM product_detail a
JOIN product_detail b
ON b.product_id = a.product_id
AND b.detail_id <> a.detail_id
JOIN product_detail c
ON c.product_id <> a.product_id
AND c.detail_id = a.detail_id
JOIN product_detail d
ON d.product_id = c.product_id
AND d.detail_id = b.detail_id
WHERE a.product_id = 1;
+------------+
| product_id |
+------------+
| 2 |
| 4 |
+------------+
答案 1 :(得分:0)
除了@ Strawberry对JOIN的建议之外,这也可以使用HAVING来过滤产品,这些产品具有(至少)与搜索产品相同intDescription_detail_ID
个相同行数的产品:< / p>
SELECT intDescription_product_ID
FROM tbldescriptions t1
WHERE intDescription_detail_ID IN (
SELECT intDescription_detail_ID
FROM tbldescriptions t2
WHERE t2.intDescription_product_ID = 1
)
GROUP BY intDescription_product_ID
HAVING count(*) >= (
SELECT count(intDescription_detail_ID)
FROM tbldescriptions t3
WHERE t3.intDescription_product_ID = 1
)
http://sqlfiddle.com/#!2/ce698/2
应该记住HAVING最后应用,因此将首先选择至少一个匹配intDescription_detail_ID
的所有产品,然后根据实际计数过滤结果 - 因此,取决于数据集的大小和特征,这可能不是最佳性能解决方案。