2014-02-03 2 views
-1

У меня есть запрос на запись, и я абсолютно зациклен на том, как это сделать. Вот моя ситуация, я пытаюсь предоставить конкретный product_ID, а затем сопоставлять все другие идентификаторы product_ID в базе данных, которые имеют по крайней мере один и тот же идентификатор intDescription_detail_ID как предоставленный product_ID.MySQL борется с запросом, чтобы найти аналогичные детали среди продуктов

соответствующие таблицы выглядит следующим образом:

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", то я хотел бы вернуть все идентификаторы product_ID, которые, по крайней мере, имеют intDescription_detail_ID 1 an d 2.

Таким образом, product_ID, которые должны быть возвращены, являются 1, 2 и 4, потому что все эти продукты имеют intDescription_detail_ID 1 и 2 среди их деталей.

Я очень смущен о том, как написать такой запрос, поэтому любая помощь очень ценится!

+0

И что вы пробовали? – Strawberry

+0

Я думаю, вам нужно объяснить, что именно вы хотите немного больше! –

+0

Нет. Объяснение достаточно, но я хотел бы попытаться его решить! – Strawberry

ответ

0

Альтернатива @ предложение Клубника с JOIN и это также может быть сделано с помощью HAVING для фильтрации продуктов, которые имеют (в мере) такое же количество строк с одинаковыми intDescription_detail_ID х в качестве продукта поиск выполняется для:

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, и сначала отфильтровываем результаты на основе фактического счета - так что в зависимости от размера и характеристики ваших данных это не может быть лучшим решением.

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 | 
    +------------+ 
+0

Я играл с этим и менял product_id на 2 и обнаружил, что запрос соответствует 1 и 4, но я надеялся, что 2 не найдут совпадений, так как набор подробностей (1, 2 и 6) не имел матч на любые другие продукты. – user3267745

Смежные вопросы