1

データベースからニュース記事を取得し、それに関連するアイテムも取得しようとしています。データベース構造は次のようになります。

news               (id, article        )
newsItemsRelation  (id, newsId,  itemId)
newsAuthorRelation (id, newsId,  userId)
items              (id, itemTitle      )

次に、アイテムとユーザーのデータのテーブルもあります。

以下のクエリを実行すると、同じ記事に複数の著者がいる場合はアイテムが重複し、同じ記事に複数のアイテムがある場合は著者が重複します。

SELECT
        article,
        GROUP_CONCAT(name) AS author,
        GROUP_CONCAT(itemTitle) AS item
    FROM news
    LEFT JOIN newsItemsRelation ON
        newsItemsRelation.newsId = news.id
    LEFT JOIN items ON
        items.id = newsItemsRelation.itemId
    LEFT JOIN newsAuthorsRelation ON
        newsAuthorsRelation.newsId = news.id
    LEFT JOIN profiles ON
        profiles.id = newsAuthorsRelation.userId
    GROUP BY news.id

編集1

私の結果は次のようになります。

記事: ここに記事が入ります

著者: ウォルター ホワイト、デクスター モーガン、ウォルター ホワイト、デクスター モーガン

アイテム: ブレイキング・バッド、デクスター、ブレイキング・バッド、デクスター

編集2

複数のアイテムが同じ itemTitle でも異なる ID を持つ可能性があるため、OR を実行しても問題は解決しませんGROUP_CONCAT(DISTINCT name)GROUP_CONCAT(DISTINCT itemTitle)著者についても同様です。つまり、私の結果は「デクスター、デクスター」のように見えるかもしれませんが、今は「デクスター、デクスター、デクスター、デクスター」のように見えます

4

3 に答える 3

2

あなたの問題は、アイテムと作成者の間に関連付けがないことです。したがって、著者ごと、アイテムごとに、重複した結果が得られます。

次のようなことを試してください:

    SELECT
        article,
        author,
        item
    FROM news
    LEFT JOIN (
      SELECT 
           News.Id as NewsId,
           GROUP_CONCAT(itemTitle) AS item
       FROM news
       LEFT JOIN newsItemsRelation ON
           newsItemsRelation.newsId = news.id
       LEFT JOIN items ON
           items.id = newsItemsRelation.itemId
       GROUP BY News.Id
      ) items on news.Id = items.NewsId
    LEFT JOIN (
       SELECT 
           News.Id as NewsId,
           GROUP_CONCAT(Name) AS Author
       FROM news
       LEFT JOIN newsAuthorsRelation ON
           newsAuthorsRelation.newsId = news.id
       LEFT JOIN profiles ON
           profiles.id = newsAuthorsRelation.userId
       GROUP BY News.Id
      ) Authors on news.Id = Authors.NewsId

そしてSQLフィドル

幸運を!

于 2013-01-25T23:39:06.460 に答える
1

記事ごとにグループ化し、名前に対して DISTINCT を実行してみてください

SELECT
        article,
        GROUP_CONCAT(DISTINCT name) AS author,
        GROUP_CONCAT(DISTINCT itemTitle) AS item
    FROM news
    LEFT JOIN newsItemsRelation ON
        newsItemsRelation.newsId = news.id
    LEFT JOIN items ON
        items.id = newsItemsRelation.itemId
    LEFT JOIN newsAuthorsRelation ON
        newsAuthorsRelation.newsId = news.id
    LEFT JOIN profiles ON
        profiles.id = newsAuthorsRelation.userId
    GROUP BY article
于 2013-01-25T22:40:24.763 に答える
-1

この問題に遭遇したときに私がすることは、クエリをサブクエリにして、そこからフィルタリングすることです。もう 1 つの方法は、列サブクエリ方法です (これは非常に高価なので嫌いです)。

于 2013-01-25T23:32:39.990 に答える