簡體   English   中英

MySQL-用table2和table3中的兩列的AVG聯接table1的列

[英]MySQL - JOIN columns of table1 with AVG of two columns from table2 and table3

我正在嘗試合並以下3個表的列。

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和rating.page_id

更具體地說,我想獲得“ star_total”的comment.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`
)

我認為您需要合並評級數據,然后計算每頁的平均值,然后將結果加入各頁。

  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

我們可以做這樣的事情:

    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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM