MySQL将2个表连接到一个主表中

时间:2015-02-11 12:36:38

标签: mysql join left-join

我有2个表'cat'和'sub_cat',这两个表应该加入主表'product'

我尝试了所有加入方法,而非他们给了我正确的结果我想要的。 我确定有一种方法。我不知道该怎么称呼。

Sample SQL

这是最后一个查询的方式 This is how the last query should be

忘记规范化理论和所有事情,我只想让最后一个查询像我可以在这上面使用的这个或mysql方法。

  1. cat_id不能重复
  2. s_id也应该不能重复
  3. 就像第三行一样,可以是:cat_id但没有s_id,s_id应为null
  4. 如果没有cat_id且没有s_id,则两者都应为null,如第四行
  5. p_id可以重复
  6. 不能使用group by或distinct因为它不会给出null值,因为我知道
  7. 只有我接近的方法是使用左边将cat和sub_cat连接到prod表,但是它给了我重复的cat_id和s_id,并且不能使用group by或distinct,因为应该有null值。

    这是测试数据

    CREATE TABLE IF NOT EXISTS `cat` (
        `product_id` int(11) DEFAULT NULL,
        `cat_id` int(11) DEFAULT NULL,
        `cat_name` varchar(10) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO `cat` (`product_id`, `cat_id`, `cat_name`) VALUES
    (1, 1, 'cat1'),
    (2, 2, 'cat2'),
    (3, 3, 'cat3'),
    (1, 4, 'ca4');
    
    CREATE TABLE IF NOT EXISTS `prod` (
        `product_id` int(11) DEFAULT NULL,
        `name` varchar(10) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO `prod` (`product_id`, `name`) VALUES
    (1, 'prod1'),
    (2, 'prod2'),
    (3, 'pro3'),
    (4, 'prod4');
    
    CREATE TABLE IF NOT EXISTS `sub_cat` (
         `product_id` int(11) DEFAULT NULL,
         `sub_cat_id` int(11) DEFAULT NULL,
         `sub_cat_name` varchar(10) DEFAULT NULL
    ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
    
    INSERT INTO `sub_cat` (`product_id`, `sub_cat_id`, `sub_cat_name`) VALUES
    (1, 1, 'sub cat 1'),
    (2, 2, 'sub cat 2'),
    (1, 3, 'sub3');
    

1 个答案:

答案 0 :(得分:1)

我在这个one.prop_cat中做了类似的事情,你作为Category表,prop_subcat作为你的子类表和属性作为你的产品。

CREATE TABLE `prop_cat` (
  `pcat_id` int(11) NOT NULL AUTO_INCREMENT,
  `pcat_name` varchar(60) DEFAULT NULL,
  PRIMARY KEY (`pcat_id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8;
CREATE TABLE `prop_subcat` (
  `psubcat_id` int(11) NOT NULL,
  `pcat_id` int(11) NOT NULL,
  `psubcat_name` varchar(45) DEFAULT NULL,
  PRIMARY KEY (`psubcat_id`,`pcat_id`),
  KEY `pspc_idx` (`pcat_id`),
  CONSTRAINT `catsub` FOREIGN KEY (`pcat_id`) REFERENCES `prop_cat` (`pcat_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `property` (
  `prop_id` int(11) NOT NULL AUTO_INCREMENT,
  `prop_name` varchar(25) DEFAULT NULL,
  `price` double DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  `image` varchar(60) DEFAULT NULL,
  `area` double DEFAULT NULL,

  `psubcat_id` int(11) DEFAULT NULL,

  `description` text,
  PRIMARY KEY (`prop_id`),
  KEY `psub_idx` (`psubcat_id`),
  CONSTRAINT `psub` FOREIGN KEY (`psubcat_id`) REFERENCES `prop_subcat` (`pcat_id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;



SELECT
     prop_cat.`pcat_id` AS prop_cat_pcat_id,
     prop_cat.`pcat_name` AS prop_cat_pcat_name,
     prop_subcat.`psubcat_id` AS prop_subcat_psubcat_id,
     prop_subcat.`pcat_id` AS prop_subcat_pcat_id,
     prop_subcat.`psubcat_name` AS prop_subcat_psubcat_name,
     property.`prop_id` AS property_prop_id,
     property.`prop_name` AS property_prop_name,
     property.`price` AS property_price,
     property.`location` AS property_location,
     property.`image` AS property_image,
     property.`area` AS property_area,
     property.`psubcat_id` AS property_psubcat_id,
     property.`description` AS property_description
FROM
     `prop_cat` prop_cat INNER JOIN `prop_subcat` prop_subcat ON prop_cat.`pcat_id` = prop_subcat.`pcat_id`
     INNER JOIN `property` property ON prop_subcat.`pcat_id` = property.`psubcat_id`