[英]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.