[英]Calculate average for specific rows in MySQL
我有以下兩個表:
content:
| id | name | created_by |
+----+-------+------------+
| 1 | test | me |
| 2 | test2 | me |
| 3 | test3 | you |
| 4 | test4 | me |
like_dislike:
| id | content_id | like | dislike |
+----+------------+------+---------+
| 1 | 1 | 1 | 0 |
| 2 | 2 | 1 | 0 |
| 3 | 2 | 0 | 0 |
我需要計算最近2個內容行的平均點贊,其中created_by = me
。
因此,例如,最后兩個content_id是2和4。
like_dislike表記錄了content_id 2,其中like為1的行,like為0的行,因此平均值為1/2。
我已經嘗試了以下查詢,但無法正常工作:
SELECT ((SELECT COUNT(*)
FROM `like_dislike`
WHERE `like`='1' AND `content_id`= pi.id) / (COUNT(*))
FROM content AS pi
WHERE pi.create_by = 'me'
ORDER BY pi.id DESC
LIMIT 2
SELECT x.*
, AVG(liked)
FROM content x
JOIN content y
ON y.created_by = x.created_by
AND y.id >= x.id
JOIN like_dislike z
ON z.content_id = x.id
WHERE x.created_by = 'me'
GROUP BY x.id
HAVING COUNT(DISTINCT y.id) <= 2;
或類似的東西
即使您可能看不到它,您似乎也想在這里做些什么,以獲得最大的每組人數。 有關更多信息,請參見本文 。
因此,我要做的是首先獲取您創建的最新的兩個content
行,如下所示:
SELECT c.*
FROM content c
WHERE(
SELECT COUNT(*)
FROM content co
WHERE co.created_by = c.created_by AND co.id >= c.id) <= 2
AND c.created_by = 'me';
在下一部分中,我將稍微慢一些,因為這有些棘手。 您可以在content_id匹配的情況下將上述內容與like_dislike表連接起來,因此您可以查看最近兩篇博文的總贊數:
SELECT c.*, ld.*
FROM content c
JOIN like_dislike ld ON ld.content_id = c.id
WHERE(
SELECT COUNT(*)
FROM content co
WHERE co.created_by = c.created_by AND co.id >= c.id) <= 2
AND c.created_by = 'me';
一旦有了,就可以使用AVG()
函數獲取平均點贊,並按每個content_id進行分組,如下所示:
SELECT c.id, AVG(ld.liked) AS averageLikes
FROM content c
JOIN like_dislike ld ON ld.content_id = c.id
WHERE(
SELECT COUNT(*)
FROM content co
WHERE co.created_by = c.created_by AND co.id >= c.id) <= 2
AND c.created_by = 'me'
GROUP BY c.id;
這里要注意的一件事:這只會顯示具有相關活動的帖子。 換句話說,content_id 4將不會出現。 如果需要查看它,可以執行LEFT JOIN,檢查平均值是否為空,如果平均值為零,則將其替換為0,如下所示:
SELECT c.id, IFNULL(AVG(ld.liked), 0) AS averageLikes
FROM content c
LEFT JOIN like_dislike ld ON ld.content_id = c.id
WHERE(
SELECT COUNT(*)
FROM content co
WHERE co.created_by = c.created_by AND co.id >= c.id) <= 2
AND c.created_by = 'me'
GROUP BY c.id;
這是您的SQL Fiddle。
還請注意 like
是MySQL中的保留字,因此我將小提琴中的兩列更改為“ liked
和“ disliked
。 我建議您也這樣做。
如果您一次只想為一個用戶提供此信息,那么您就不需要使用自連接或變量來做一些花哨的事情。 您可以在子查詢中使用limit
:
select avg(like)
from like_dislike ld join
(select c.*
from content c
where c.create_by = 'me'
order by id
limit 2
) c2
on ld.content_id = c2.id;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.