簡體   English   中英

計算MySQL中特定行的平均值

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

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