2011-12-28 22 views
3

私は参加するのに苦労しています。基本的には、私のクエリのタグ結果を単一の行にしたいのです。MySQL Left Outer Joinと結果の結合

  • cover
  • category
  • cover_tag
  • tag

クエリがカバー、カテゴリを返し、そのカテゴリのすべてのタグ:

は、以下の私のテーブルです。タグのNULL結果は許可されています。これは、タグが追加されていない場合でもすべてのカバーを取得します。

データベースには2つの行があります。第1カバーには3つのタグがあり、第2カバーにはタグがありません。以下のクエリを実行すると、4行が得られます。それらのうちの3つは第1のカバーであり、異なるタグを有し、第4のタグはタグのない行である。

基本的には、1つの行内の各カバーのすべてのタグを含む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

サンプルがありますか?アットダンプ? –

+0

StackOverflowに追加できるように、データをphpMyAdminで取得するにはどうすればよいですか?私はテーブル形式でしかデータを取得しません。 – 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

関連する問題