1

私は3つのテーブルを持っています:

CREATE TABLE `b10g_entries` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT,
  `permalink` text NOT NULL,
  `title` varchar(300) NOT NULL,
  `fullcontent` text NOT NULL,
  `introcontent` text NOT NULL,
  `dateadded` datetime NOT NULL,
  `lastedited` datetime NOT NULL,
  `author` varchar(40) NOT NULL,
  `comments` int(11) NOT NULL DEFAULT '0',
  `published` tinyint(1) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=299 DEFAULT CHARSET=utf8

CREATE TABLE `b10g_tag_map` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `tag_id` bigint(20) unsigned DEFAULT NULL,
  `entry_id` bigint(20) unsigned DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8

CREATE TABLE `b10g_tags` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `name` text NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

そして、次のクエリを使用して、タグ付きの最初の 25 のブログ エントリを取得しようとしています (そのため、多対多の関係を使用しています)。

SELECT b10g_entries.*, GROUP_CONCAT( b10g_tags.name SEPARATOR ', ') 
AS tags FROM b10g_entries 
LEFT JOIN b10g_tag_map ON b10g_entries.id = b10g_tag_map.entry_id 
LEFT JOIN b10g_tags ON b10g_tag_map.tag_id = b10g_tags.id LIMIT 0, 25;

しかし、戻ってきたレコードは 1 つだけです。このクエリの何が問題になっていますか?

4

2 に答える 2

1

GROUPBY句を追加します。

これで、セット内の任意の場所にあるすべてのタグのリストが表示されます。代わりに、グループ内のものだけが必要です(エントリによる)。

SELECT b10g_entries.*, GROUP_CONCAT( b10g_tags.name SEPARATOR ', ') 
AS tags FROM b10g_entries 
LEFT JOIN b10g_tag_map ON b10g_entries.id = b10g_tag_map.entry_id 
LEFT JOIN b10g_tags ON b10g_tag_map.tag_id = b10g_tags.id 
GROUP BY b10g_entries.id
于 2012-04-26T03:32:15.510 に答える
1

GROUP_CONCAT()集計関数がありますが、句GROUP BYを使用していないため、結果は1行になります。

GROUP BYMySQLでは、1つの列のみを指定して、さらに多くの列をリストに表示することは許可されていますSELECTが、他のRDBMSには移植できないことに注意してください。その代わりに、b10g_entriesでのみ使用しながら、そのテーブルの他のすべての列を接続するために2回目に参加しidましたGROUP BY

SELECT
  b10g_entries_all.*, 
  GROUP_CONCAT( b10g_tags.name SEPARATOR ', ') AS tags
FROM
  /* Main table, used gor GROUP BY aggregate */
  b10g_entries
  /* self join to pull in other columns without needing to put them in GROUP BY */
  JOIN b10g_entries b10g_entries_all ON b10g_entries.id = b10g_entries_all.id 
  LEFT JOIN b10g_tag_map ON b10g_entries.id = b10g_tag_map.entry_id 
  LEFT JOIN b10g_tags ON b10g_tag_map.tag_id = b10g_tags.id 
/* group on the entry id */
GROUP BY b10g_entries.id
LIMIT 0, 25;
于 2012-04-26T03:33:04.353 に答える