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);
這會給我product_color表中的每個product_id。 – 2010-09-23 23:30:58
是的,我剛剛發佈後看到,我已經對sql進行了改革,以考慮到這一點。 – JonVD 2010-09-23 23:35:16
你是一個聖人。謝謝。我沒有以正確的方式思考這個問題。 – 2010-09-23 23:41:55