2017-11-06 23 views
0

次の3つの表の列を結合しようとしています。テーブル2とテーブル3の2つの列のAVGを持つtable1のMySQL - JOIN列

pages: 
*id* | *identifier* | reference | url  | ... 
------------------------------------------------------- 
1 | 1    | page one | http://... | ... 
2 | 3    | page two | .....  | ... 
3 | 23    | page three | .....  | ... 
4 | 25    | page four | .....  | ... 
5 | 43    | page five | .....  | ... 

comments: 
page_id | *rating* | comment | is_approved | name | ... 
------------------------------------------------------- 
1  | 4  | bla bla | 1   | joe | ... 
2  | 5  | more bla | 1   | jim | ... 
2  | 3  | blub  | 1   | jill | ... 
3  | 1  | blubblub | 1   | jack | ... 
4  | 2  | hey ho | 0   | jimbo| ... 
5  | 4  | huhu  | 1   | mike | ... 

ratings: 
page_id | *rating* | ip_address | ... 
----------------------------------- 
1  | 3  | ...  | ... 
1  | 2  | ...  | ... 
2  | 5  | ...  | ... 
3  | 4  | ...  | ... 
4  | 0  | ...  | ... 
5  | 2  | ...  | ... 

pages.idリンクはcomments.page_idと具体的

をratings.page_id、私は 'star_total' AS comments.ratingとratings.ratingの平均値を取得したいのですが、この新しいを結合します"ページ"からの腐食性のある行を持つ列になります。このように、id、identifier、star_totalのようなテーブル構造が得られます。

これは、私がおしゃべりしていることです。私はそれがどのようにすべきかわからない。それだけで大まかなアイデアだと私は得た限り:

SELECT pages.id, pages.identifier, star_total 
FROM pages LEFT JOIN 
(
    SELECT AVG(`rating`) FROM (
     SELECT 'rating' FROM comments 
     WHERE `comments.is_approved = '1' 
      AND comments.rating != '0' 
      AND comments.page_id = ratings.page_id 
     UNION ALL 
     SELECT `rating` 
     FROM ratings 
     WHERE ratings.page_id = comments.page_id 
    ) AS `star_total` 
) 
+0

サンプルデータと必要な結果を表形式で入力してください。コメントとして投稿しないでください。代わりに[編集]を使用してください。 –

+0

両方の回答ありがとう!問題が解決しました。 –

答えて

0

は、我々はこのような何かを行うことができます:大規模なセットの場合

SELECT pages.id 
     , pages.identifier 
     , q.star_total 
     FROM pages 
     LEFT 
     JOIN (SELECT t.page_id 
        , SUM(t.tot_rating)/SUM(t.cnt_rating) AS star_total 
       FROM (SELECT c.page_id   AS page_id 
          , SUM(c.rating)  AS tot_rating 
          , COUNT(c.rating)  AS cnt_rating 
         FROM comments c 
         WHERE c.is_approved = '1' 
         AND c.rating != '0' 
         GROUP BY c.page_id 
         UNION ALL 
         SELECT r.page_id  -- AS page_id 
          , SUM(r.rating) -- AS tot_rating 
          , COUNT(r.rating) -- AS cnt_rating 
         FROM ratings r 
         GROUP BY r.page_id 
        ) t 
       GROUP BY t.page_id 
      ) q 
     ON q.page_id = pages.id 

は、これらのインライン・ビュー(派生テーブル)が高価になるだろうされています。同等の結果を得るためのやや簡単なアプローチで、インライン表示のパフォーマンスの問題を悪化させる可能性があります。

SELECT pages.id 
     , pages.identifier 
     , q.star_total 
     FROM pages 
     LEFT 
     JOIN (SELECT t.page_id 
        , AVG(t.rating) AS star_total 
       FROM (SELECT c.page_id   AS page_id 
          , c.rating   AS rating 
         FROM comments c 
         WHERE c.is_approved = '1' 
         AND c.rating != '0' 
         UNION ALL 
         SELECT r.page_id  -- AS page_id 
          , r.rating   -- AS rating 
         FROM ratings r 
        ) t 
       GROUP BY t.page_id 
      ) q 
     ON q.page_id = pages.id 
0

私はあなたが組合に評価データが必要だと思うし、その後、ページにその結果を結合、ページあたりの平均を計算します。

SELECT 
     p.id 
     , p.identifier 
     , u star_total 
    FROM pages AS p 
    LEFT JOIN (
       SELECT 
        page_id 
        , AVG(rating) star_total 
       FROM (
        SELECT 
          page_id 
         , rating 
        FROM comments 
        WHERE comments.is_approved = '1' 
        AND comments.rating != '0' 

        UNION ALL 

        SELECT 
          page_id 
         , rating 
        FROM ratings 
      ) d 
       GROUP BY 
        page_id 
     ) AS u ON p.id = u.id 
関連する問題