2010-09-23 51 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