3

タイトルがひどいので、Google で探しているものが見つからないのでしょう。

私がやろうとしているのは、古い社内ブログからいくつかのデータをエクスポートして、それを別のものにインポートできるようにすることです。私の問題は、私が探している種類の JOIN を作成することはできますが、2 番目のテーブルの一致には複数の行が含まれている可能性があるため、大量の重複データが発生することです。2 番目のテーブルから結果を取得し、それらを (複数の一致がある場合) クエリ結果の 1 つのフィールドに連結する必要があります。クエリに WHERE 制約は必要ありません。blog_posts テーブル全体を取得しようとしています。

このテーブル構造の簡略化されたレイアウトが、次のことを説明するのに役立つことを願っています。

blog_posts              blog_categories
---------------------------------------
post_id                 post_id
post_content            category_id
post_author

そして、ここにいくつかのサンプルデータがあります。

blog_posts テーブル データ:

post_id  post_content  post_author
----------------------------------
1        foo1          bob
2        foo2          bob
3        foo3          fred

blog_categories テーブル データ:

post_id  category_id
--------------------
1        1
1        2
1        6
2        1
3        2
3        4

そして、私の理想的な結果は次のようになります。

post_id  post_content  post_author  category_ids
------------------------------------------------
1        foo1          bob          1,2,6
2        foo2          bob          1
3        foo3          fred         2,4

私が得ることができる最も近いものは、次のような単純な結合でした:

SELECT 
    blog_posts.post_id, 
    blog_posts.post_content, 
    blog_posts.post_author, 
    blog_categories.category_id 
FROM blog_posts 
    INNER JOIN blog_categories 
        ON blog_posts.post_id = blog_categories.post_id

しかし、それは blog_posts テーブルで複数回一致を返します (一致する各 category_id に対して 1 回)。

SQL だけを使用して目的を達成する方法はありますか? ある種のサブ選択が機能すると考えていますが、それがどのように機能するかについて頭を悩ませることはできません.現在の投稿IDですが、その構文は私をエスケープします。効率的である必要はありません。これは 1 回限りの操作です。

4

2 に答える 2

2

このgroup_concat()関数は、必要なことを正確に実行します。

SELECT 
  blog_posts.post_id, 
  blog_posts.post_content, 
  blog_posts.post_author, 
  group_concat(blog_categories.category_id)
FROM blog_posts 
JOIN blog_categories ON blog_posts.post_id = blog_categories.post_id
GROUP BY 1, 2, 3
于 2013-03-04T01:32:46.563 に答える
0

あなたがしたいGROUP BY blog_posts.post_id, blog_posts.post_content, blog_posts.post_author。次に、aggregate function( http://en.wikipedia.org/wiki/Aggregate_function ) を使用してblog_categories.category_id、各グループからすべての値を取得し、それを単一の文字列に変換します。

どの DBMS を使用していますか? Postgres の場合、おそらく単純に配列を集計関数として使用できます。

SELECT
  blog_posts.post_id,
  blog_posts.post_content,
  blog_posts.post_author,
  ARRAY_AGG(blog_categories.category_id)
FROM blog_posts
INNER JOIN blog_categories ON blog_posts.post_id = blog_categories.post_id
GROUP BY
  blog_posts.post_id,
  blog_posts.post_content,
  blog_posts.post_author

またはARRAY_TO_STRING(ARRAY_AGG(blog_categories.category_id), ',')、カンマ区切りの文字列を取得するために使用します。

于 2013-03-04T01:33:25.970 に答える