2011-12-28 3 views
3

Я борется за соединение. В основном, я хочу, чтобы теги были получены из моего запроса в одной строке.MySQL Left Outer Join and Combining Results

Ниже приведены мои таблицы:

  • cover
  • category
  • cover_tag
  • tag

запрос возвращает крышку, категорию, и все теги для этой категории. NULL приводит к тому, что теги разрешены, поэтому я получаю все покрытия независимо от того, добавлены ли теги.

В базе данных у меня есть 2 ряда в обложках. 1-я обложка имеет 3 метки, 2-я обложка не имеет тегов. При выполнении запроса ниже я получаю 4 строки. 3 из них - 1-я обложка, с другим тегом, 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'); 
+0

У вас есть образец d ata дамп? –

+0

Как получить данные в phpMyAdmin, чтобы добавить его в StackOverflow? Я получаю данные только в виде таблицы. – GV1

+0

Кнопка экспорта. Ищите его. –

ответ

4

Вы можете Соединить их с 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 
+0

Ницца. Не знал об этом. :-) –

+0

Работает отлично. Спасибо. Я не знал о «GROUP_CONCAT» – GV1