2011-12-24 10 views
0

Articlesというテーブルがあります。私もTagsのテーブルを持っています。タグテーブルは実際には記事とタグの多対多の関係として2つの別々のテーブルを持っています。たとえば:MySQL Join。あるテーブルから別のテーブルに複数の行を結合しますか?

CREATE TABLE Articles (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT 
    title VARCHAR(255), 
    author INT UNSIGNED NOT NULL, 
    body TEXT NOT NULL -- column type may not be representative 
) Engine=InnoDB; 

CREATE TABLE Tags (
    id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT, 
    name VARCHAR(32) 
) Engine=InnoDB; 

CREATE TABLE Article_Tags (
    article INT UNSIGNED NOT NULL, 
    tag INT UNSIGNED NOT NULL, 
    FOREIGN KEY (article) REFERENCES Articles (id), 
    FOREIGN KEY (tag) REFERENCES Tags (id) 
) Engine=InnoDB; 

を今、それはまた、同じクエリのタグテーブルからその記事に関連するすべてのタグを記事を返すために、単一のクエリを実行し、することは可能でしょうか?

+0

いいえ、それは宿題ではありません。私は実際にプロジェクトに関連するCodeIgniterフォーラム(私が必要ならばリンクすることができます)に質問を投稿し、誰かが単一のクエリを実行するように提案しました。私はそれが可能かどうかわからなかったので、私は尋ねていた。 – GV1

+0

あなたは通常、table2.table1ID = table1.id内部結合table3上の 'select * from table1 inner join table2を実行します。ON table3.id = table2.table3id'ここで' table2'はあなたのリンクテーブルです。 –

+0

私は参照してください。私は私の結合が、それらをしばらく使用していないことを要約する必要があります。 – GV1

答えて

0

article(id, title, content)を持っていると仮定すると

tag(id, name)を持っており、article_tags(テーブルを結合する)(明らかに、テストしていません)このようなものはそれを行うべき、その後、(tag_id, article_id)を持っています通常はJOINステートメントを使用して、複数のテーブルの関連レコードを結合します。私は

  • ArticlesIDカラム
  • Article_Tags実際場合ArticleIDTagIDカラム
  • TagsIDカラム

を有する有し有すると仮定する

注列名が異なる場合、私のステートメントの対応する列を実際の名前に置き換える必要があります。

SQLステートメント参加を特定の列の間 関係に基づいて、二つ以上のテーブルからデータを照会するために使用されるJOIN構文

SQL約

SELECT * 
FROM Articles a 
     INNER JOIN Article_Tags at ON at.ArticleID = a.ID 
     INNER JOIN Tags t ON t.ID = at.TagID 

詳細情報これらの表の中で

1

ただ1つの行だけを取り戻すには、an aggregate functionを使用してタグを結合する必要があります。 、コメントを1として

SELECT a.title, 
     a.content, 
     GROUP_CONCAT(
     DISTINCT t.name 
     ORDER BY ASC 
     SEPARATOR ", " 
    ) as tags 
FROM article a 
INNER JOIN article_tags at ON at.article_id = a.id 
INNER JOIN tag t ON t.id = at.tag_id 
GROUP BY a.id 
関連する問題