MySQL左外连接和组合结果

问题描述:

我正在努力加入。基本上我想从我的查询标签结果是在一个单一的行。MySQL左外连接和组合结果

下面是我的表:

  • cover
  • category
  • cover_tag
  • tag

查询返回的封面,类别,该类别的所有标签。允许标签中的NULL结果,因此无论是否添加标签,都可以获得全部封面。

在数据库中,我有盖2行。第一个封面有3个标签,第二个封面没有标签。当在下面运行查询时,我得到4行。其中3个是第一个封面,带有不同的标签,第四个是没有任何标签的行。

我基本上要2个结果与在一行中的每个盖所有的标签。这可能吗?

SELECT * 
FROM cover 
JOIN category ON cover.category_id = category.id 
LEFT OUTER JOIN cover_tag ON cover_tag.cover_id = cover.id 
LEFT OUTER JOIN tag ON cover_tag.tag_id = tag.id 

从phpMyAdmin的

CREATE TABLE `category` (
    `id` int(9) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) NOT NULL, 
    `slug` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `category` VALUES(1, 'Cars', 'cars'); 
INSERT INTO `category` VALUES(2, 'Music', 'music'); 
INSERT INTO `category` VALUES(3, 'Abstract', 'abstract'); 

CREATE TABLE `cover` (
    `id` int(9) NOT NULL AUTO_INCREMENT, 
    `category_id` int(9) NOT NULL, 
    `title` varchar(255) NOT NULL, 
    `slug` varchar(255) NOT NULL, 
    `image` varchar(255) NOT NULL, 
    `timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ; 

INSERT INTO `cover` VALUES(1, 1, 'Red Ferarri', 'red-ferarri', 'redferrari.jpg', '2011-12-20 23:48:11'); 
INSERT INTO `cover` VALUES(2, 1, 'Ford Focus ST', 'ford-focus-st', 'focuss.jpg', '2011-12-20 23:48:11'); 

CREATE TABLE `cover_tag` (
    `cover_id` int(9) NOT NULL, 
    `tag_id` int(9) NOT NULL 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

INSERT INTO `cover_tag` VALUES(1, 1); 
INSERT INTO `cover_tag` VALUES(1, 2); 
INSERT INTO `cover_tag` VALUES(1, 3); 

CREATE TABLE `tag` (
    `id` int(9) NOT NULL AUTO_INCREMENT, 
    `tag` varchar(255) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ; 

INSERT INTO `tag` VALUES(1, 'cars'); 
INSERT INTO `tag` VALUES(2, 'ferarri'); 
INSERT INTO `tag` VALUES(3, 'speed'); 
+0

你有样品d ata转储? – 2011-12-28 12:10:04

+0

如何获取phpMyAdmin中的数据,以便将其添加到StackOverflow?我只以表格形式获取数据。 – GV1 2011-12-28 12:11:56

+0

有导出按钮。寻找它。 – 2011-12-28 12:13:04

数据您可以用GROUP_CONCAT与GROUP BY将它们连接起来,这样的事情:

Select c.title, GROUP_CONCAT(t.tag SEPARATOR ', ') 
From cover c 
Join cCategory ct on c.Category_Id = ct.id 
LEFT OUTER JOIN cover_tag ctg ON c.Id = ctg.cover_id 
LEFT OUTER JOIN tag t on ctg.tag_id = t.id 
GROUP By c.title 

这会给你以下几点:

title   Tags 
------------------------------------ 
Ford Focus ST {NULL} 
Red Ferarri cars, ferarri, speed 
+0

不错的一个。不知道。 :-) – 2011-12-28 12:17:23

+0

完美地工作。谢谢。我不知道“GROUP_CONCAT” – GV1 2011-12-28 12:53:20