MySQL左外连接和组合结果

时间:2011-12-28 12:03:44

标签: mysql sql group-concat

我正在努力加入。基本上我希望我的查询中的标签结果在一行中。

以下是我的表格:

  • cover
  • category
  • cover_tag
  • tag

查询返回该类别的封面,类别和所有标签。允许使用NULL结果,这样我就可以获得所有封面,无论是否添加了标签。

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

我基本上想要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');

1 个答案:

答案 0 :(得分:4)

您可以使用group by将GROUP_CONCAT连接起来,例如:

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