2016-04-30 4 views
2

グループIは、コードの下に使用しますが、私は何を期待戻らない

テーブルの関係は、複数のmedia_user_actionなどがあります。 私はこの数

rows: [ 
{ 
    "id": 1 
}, 
{ 
    "id": 2 
} 
] 

することにより、各galleryどのように多くのmedia_user_actionと注文をカウントすると、このクエリはLEFT JOINサブクエリでmedia_user_action行のみを選択するので、私が思う

rows: [ 
{ 
    "id": 1 
}, 
{ 
    "id": 1 
}, 
{ 
    "id": 2 
} 
... 
] 

のような重複ギャラリー行の何かを返します。グループによってmedia_id、 をグループ化する必要があります。gallery_id

SELECT 
g.* 
FROM gallery g 
    LEFT JOIN gallery_media gm ON gm.gallery_id = g.id 
    LEFT JOIN (
    SELECT 
     media_id, 
     COUNT(*) as mua_count 
     FROM media_user_action 
     WHERE type = 0 
     GROUP BY media_id 
    ) mua ON mua.media_id = gm.media_id 
    ORDER BY g.id desc NULLS LAST OFFSET $1 LIMIT $2 

テーブル

gallery 
id | 
1 | 
2 | 

gallery_media 
id | gallery_id fk gallery.id | media_id fk media.id 
1 | 1      | 1 
2 | 1      | 2 
3 | 2      | 3 
.... 

media_user_action 
id | media_id fk media.id | user_id | type 
1 | 1     | 1  | 0 
2 | 1     | 2  | 0 
3 | 3     | 1  | 0 
... 

media 
id | 
1 | 
2 | 
3 | 

UPDATE
私が選択する必要が複数の他のテーブルがありますが、これは、ユーザ入力オプションは、クエリを構築し、このhttps://jsfiddle.net/g8wtqqqa/1/のような機能で一部です。

は、だから私は私の質問を修正、私は、ユーザーがそれによってmedia_user_action順番をカウントしたい場合は、私がしたいの方法を見つける必要がある可能サブクエリでこれらを配置する方法を知っている他のコードを変更しない




ベース@trincotの下で、私はコードを更新し、ちょうど少し変更してサブクエリにそれらを入れてmedia_countを追加します。私が欲しいものです、
今、それらはgallery.idでグループ化されていますが、sortとmedia_countのdescとascは同じ結果です。なぜ見つからないのですか?

SELECT 
g.*, 
row_to_json(gi.*) as gallery_information, 
row_to_json(gl.*) as gallery_limit, 
media_count 
FROM gallery g 
LEFT JOIN gallery_information gi ON gi.gallery_id = g.id 
LEFT JOIN gallery_limit gl ON gl.gallery_id = g.id 
LEFT JOIN "user" u ON u.id = g.create_by_user_id 
LEFT JOIN category_gallery cg ON cg.gallery_id = g.id 
LEFT JOIN category c ON c.id = cg.category_id 
    LEFT JOIN (
    SELECT 
     gm.gallery_id, 
     COUNT(DISTINCT mua.media_id) media_count 
     FROM gallery_media gm 
     INNER JOIN media_user_action mua 
     ON mua.media_id = gm.media_id AND mua.type = 0 
     GROUP BY gm.gallery_id 
    ) gm ON gm.gallery_id = g.id 
    ORDER BY gm.media_count asc NULLS LAST OFFSET $1 LIMIT $2 
+0

重複が発生した理由を説明した回答を投稿しましたので、あなたの質問に答えています。あなたは実際に何を達成したいのか、そしてあなたの問い合わせ結果があなたが望むものとどのように違うのかを伝える別々の要求をしたいかもしれません。 (すべてのギャラリーレコードが必要な場合は、ギャラリーから選択することができます。これはおそらくあなたの後ろではありません) –

+0

返信ありがとうございます、私はすべての質問を更新しますギャラリーと他の関係テーブルを選択したい – user1575921

+1

質問に追加された「編集」は別の質問です。他のテーブルや別の問題もあります。 – trincot

答えて

2

参加するgallery_mediaテーブルがあなたの結果を増やしています。カウントとグループ化は、あなたがその参加をした後に起こるはずです。

あなたはこのようにそれを達成できます:あなたは同様に他の情報を必要とする

SELECT g.id, 
      COUNT(DISTINCT mua.media_id) 
FROM  gallery g 
LEFT JOIN gallery_media gm 
     ON gm.gallery_id = g.id 
LEFT JOIN media_user_action mua 
     ON mua.media_id = gm.id AND type = 0 
GROUP BY g.id 
ORDER BY 2 DESC 

場合、あなたはその何かに参加するサブクエリとして、(簡略化した形で)上記を使用することができますあなたは、必要があるが、行数掛けないであろう。

SELECT g.* 
      row_to_json(gi.*) as gallery_information, 
      row_to_json(gl.*) as gallery_limit, 
      media_count 
FROM  gallery g 
LEFT JOIN (
      SELECT  gm.gallery_id, 
         COUNT(DISTINCT mua.media_id) media_count 
      FROM  gallery_media gm 
      INNER JOIN media_user_action mua 
        ON mua.media_id = gm.id AND type = 0 
      GROUP BY gm.gallery_id 
     ) gm 
     ON gm.gallery_id = g.id 
LEFT JOIN gallery_information gi ON gi.gallery_id = g.id 
LEFT JOIN gallery_limit gl ON gl.gallery_id = g.id 
ORDER BY media_count DESC NULLS LAST 
OFFSET $1 
LIMIT  $2 

を上記gallery_idは、テーブル内で一意であることを前提としていgallery_informationgallery_limit

+0

おかげで他の行を変更しないだろう、という削除する場合ので、私はあなたが意味 – user1575921

+0

ソートdescとASCは、いくつかの結果https://jsfiddle.net/grvbf9jv/1/ですみます – user1575921

+0

何かを欠場します**同じ**結果?私はあなたが言っていることを理解していない...あなたはJSフィドルの代わりに[SQLフィドル](http://sqlfiddle.com/)を作れますか? – trincot

0

あなたはカウントを取得するためにmedia_idによってグループ化しているが、1 galleryは多くのgallery_mediaを持つことができるので、あなたはまだ1 galleryための複数の行で終わります。あなたの副選択からmua_countを合計することができ、次のいずれか

SELECT g.*, sum(mua_count) 
FROM gallery g 
LEFT JOIN gallery_media gm ON gm.gallery_id = g.id 
LEFT JOIN (
    SELECT media_id, 
    COUNT(*) as mua_count 
    FROM media_user_action 
    WHERE type = 0 
    GROUP BY media_id 
) mua ON mua.media_id = gm.media_id 
GROUP BY g.id 
ORDER BY g.id desc NULLS LAST; 
id | sum 
----+----- 
    2 | 1 
    1 | 2 

それとも、できるだけJOIN一度g.id上を通って、グループのすべての方法:

SELECT g.id, count(*) 
FROM gallery g 
JOIN gallery_media gm ON gm.gallery_id = g.id 
JOIN media_user_action mua ON mua.media_id = gm.id 
GROUP BY g.id 
ORDER BY count DESC; 
id | count 
----+------- 
    1 |  2 
    2 |  1 
+0

私はあなたのコードに従ってくれてありがとう私はあなたのコードに従ってくれてありがとうございました。私は質問に投稿しました – user1575921

+0

集計関数( 'count'、' sum'など)でないものは全て 'GROUP BY'節に現れなければなりません。あなたの新しいクエリのために、それは 'GROUP BY g。*、gi。*、gl。*'を意味するでしょうが、それは手が届きません。サブクエリで 'g.id、count'だけを取り出し、' gi'と 'gl'に参加して残りのデータを取得してみてください。 –

+0

私はすべての関係を置くことができる方法はありますか?1つのサブクエリにmedia_user_actionを数えます。 – user1575921

-1

テーブルgalleryselect g.*)のデータのみを表示する場合は、なぜ他のテーブルに参加しますか?外部結合は、外部結合テーブルに一致する数に応じて1つまたは複数のレコードを各メインレコードに結合するため、重複することはありません(ギャラリーID 1にはgallery_mediaに2つの一致があるため、

+0

なぜこれがダウンリストされたのか分かりません。メインテーブルにテーブルを外部結合することによって、メインまたはそれ以上のレコード数を取得できます。サンプルデータは、なぜこの場合にはより多くのものであるかを示しています。だから、私の答えは完全だと思います。 (質問:私はコメントセクションで、重複を避けるためにクエリを 'select * from gallery'に単純化している可能性があると述べました。 –

関連する問題