MySQL努力寻求查询以查找产品之间的类似细节

时间:2014-02-03 23:02:28

标签: php mysql

我有一个要写的查询,我绝对不知道如何去做。这是我的情况,我试图提供一个特定的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,因为所有这些产品的详细信息中的i​​ntDescription_detail_ID为1和2。

我对如何编写这样的查询非常困惑,所以非常感谢任何帮助!

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的所有产品,然后根据实际计数过滤结果 - 因此,取决于数据集的大小和特征,这可能不是最佳性能解决方案。