【问题标题】:Help with querying a many to many table in mysql帮助查询mysql中的多对多表
【发布时间】:2010-09-23 23:22:42
【问题描述】:

我正在尝试获取没有特定颜色的产品 ID 列表(数据库是 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);

【问题讨论】:

    标签: mysql join many-to-many


    【解决方案1】:

    我认为 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)); 
    

    编辑:我刚刚看到多对多位!这行得通。

    【讨论】:

    • 这会给我 product_color 表中的每个 product_id。
    • 是的,我看到刚刚发布后,我已经修改了 sql 以考虑到这一点。
    • 你是圣人。谢谢你。我没有以正确的方式思考这个问题。
    • 没问题,尝试自己解决这些问题绝不会很有趣。
    猜你喜欢
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 1970-01-01
    • 2011-03-08
    • 2023-03-15
    • 1970-01-01
    相关资源
    最近更新 更多