2

たとえば、タグ付きの単純なブログがあるとします。Blog テーブル、Tag テーブル、TagRelation テーブルがあります。単一のクエリを実行して、タグを含む各ブログ投稿の関連データをすべて独自の単一行で取得したいと考えています。

SELECT Tag.id AS 'Tag.id', Tag.name AS 'Tag.name', Blog.id AS 'Blog.id', Blog.author AS 'Blog.author', Blog.title AS 'Blog.title', Blog.content AS 'Blog.content' 
FROM Blog 
INNER JOIN TagRelation ON TagRelation.target = Blog.id
INNER JOIN Tag ON Tag.id = TagRelation.Tag
WHERE Blog.id = '101'

このクエリは、投稿 ID 101 の同じブログ投稿データを含む各タグの行を提供し、追加するGROUP BY Blog.idと 1 行のみが提供されますが、最初のタグの結果は任意です。

私が欲しいのは次のようなものです:

Blog.id | Blog.author | Blog.title | Blog.content | Tag.id | Tag.name | Tag.id | Tag.name 
-----------------------------------------------------------------------------------------
101     | someone     | something  | lolstuff     | 1      | tag1     | 2      | tag2

私のクライアント側のコードがそれをオブジェクトに簡単に解析できるように。これは、同じブログ ID に対して複数の一致する行を処理したり、各投稿のタグを取得するためだけにサブクエリを実行したりせずに、MySQL で可能ですか? (もちろん、実際のデータベースはこれよりも大きく複雑なので、できるだけ多くの結合を行いたいと考えています。)

4

1 に答える 1

1

の使用を含むアプローチソリューションGROUP_CONCAT():

SELECT
    GROUP_CONCAT(Tag.id SEPARATOR ',') AS 'Tag.ids',
    GROUP_CONCAT(Tag.name SEPARATOR ',') AS 'Tag.names',
    Blog.id, Blog.author, Blog.title, Blog.content
FROM Blog 
INNER JOIN TagRelation ON TagRelation.target = Blog.id
INNER JOIN Tag ON Tag.id = TagRelation.Tag
WHERE Blog.id = '101'
GROUP BY Blog.id

これにより、対応する と の 2 つのカンマ区切りのリストがTag.idTag.nameおよびTag.idsTag.namesそれぞれ表示されます。

しかし、繰り返しますが、アプリケーション コードで行ではなく列 (この場合はコンマ区切りの値) を反復処理する方が本当に簡単でしょうか?

于 2013-07-30T22:45:09.187 に答える