2010-09-23 64 views
0

我想獲得產品ID的列表沒有某些顏色查詢多對多表(數據庫爲MySQL)幫助與MySQL的

這裏是我的表:

product 
+------------+-------------+ 
| product_id | description | 
+------------+-------------+ 
|   1 | Widget 1 | 
|   2 | Widget 2 | 
|   3 | Widget 3 | 
|   4 | Widget 4 | 
|   5 | Widget 5 | 
|   6 | Widget 6 | 
+------------+-------------+ 

color 
+----------+-------+ 
| color_id | name | 
+----------+-------+ 
|  1 | red | 
|  2 | black | 
|  3 | white | 
|  4 | green | 
|  5 | blue | 
|  6 | pink | 
+----------+-------+ 

product_color 
+------------+----------+ 
| product_id | color_id | 
+------------+----------+ 
|   1 | 1  | 
|   1 | 4  | 
|   1 | 5  | 
|   2 | 2  | 
|   2 | 3  | 
|   3 | 1  | 
|   3 | 2  | 
|   3 | 3  | 
|   5 | 3  | 
|   5 | 6  | 
|   6 | 1  | 
|   6 | 5  | 
|   6 | 6  | 
+------------+----------+ 

我想選擇所有沒有顏色4(綠色),5(藍色)或6(粉紅色)的產品。

因此,從上面的表中,產品2,3和4將出現在結果集中。

我已經能夠做的最好的是:

SELECT product.*, GROUP_CONCAT(product_color.color_id) as color_ids 
FROM product 
LEFT JOIN product_color USING (product_id) 
GROUP BY product.product_id 

這裏是我的結果集:

-------------------------------------- 
product_id description  color_ids 
-------------------------------------- 
1   Widget 1  1,4,5 
2   Widget 2  2,3 
3   Widget 3  1,2,3 
4   Widget 4  NULL 
5   Widget 5  3,6 
6   Widget 6  1,3,6 

然後我編程方式進行篩選,但我寧願爲數據庫盡一切努力,如果可以的話。

最好,我想我的結果集看起來像這樣(我需要的是產品ID)。

------------ 
product_id 
------------ 
2 
3 
4 

這裏的架構和數據只是區分你的善​​良的靈魂想幫助我。

CREATE TABLE IF NOT EXISTS `color` (
    `color_id` int(10) unsigned NOT NULL auto_increment, 
    `name` varchar(25) NOT NULL, 
    PRIMARY KEY (`color_id`), 
    UNIQUE KEY `name` (`name`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

INSERT INTO `color` (`color_id`, `name`) VALUES 
(2, 'black'), 
(5, 'blue'), 
(4, 'green'), 
(6, 'pink'), 
(1, 'red'), 
(3, 'white'); 

CREATE TABLE IF NOT EXISTS `product` (
    `product_id` int(10) unsigned NOT NULL auto_increment, 
    `description` varchar(25) NOT NULL, 
    PRIMARY KEY (`product_id`), 
    UNIQUE KEY `description` (`description`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ; 

INSERT INTO `product` (`product_id`, `description`) VALUES 
(1, 'Widget 1'), 
(2, 'Widget 2'), 
(3, 'Widget 3'), 
(4, 'Widget 4'), 
(5, 'Widget 5'), 
(6, 'Widget 6'); 

CREATE TABLE IF NOT EXISTS `product_color` (
    `product_id` int(10) unsigned NOT NULL, 
    `color_id` int(10) unsigned NOT NULL, 
    PRIMARY KEY (`product_id`,`color_id`), 
    KEY `color_id` (`color_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `product_color` (`product_id`, `color_id`) VALUES 
(1, 1), 
(3, 1), 
(6, 1), 
(2, 2), 
(3, 2), 
(2, 3), 
(3, 3), 
(5, 3), 
(1, 4), 
(1, 5), 
(6, 5), 
(5, 6), 
(6, 6); 

回答

2

我認爲where子句中的子查詢應該是足夠的。

SELECT DISTINCT product_id 
FROM product 
WHERE product_id NOT IN (SELECT product_id FROM product_color WHERE color_id IN (4, 5, 6)); 

編輯:我只看到了許多到位!這工作。

+0

這會給我product_color表中的每個product_id。 – 2010-09-23 23:30:58

+0

是的,我剛剛發佈後看到,我已經對sql進行了改革,以考慮到這一點。 – JonVD 2010-09-23 23:35:16

+0

你是一個聖人。謝謝。我沒有以正確的方式思考這個問題。 – 2010-09-23 23:41:55