【问题标题】:Calculate Average Rating to show on press of Next Previous Button [closed]计算平均评分以在按下下一个上一个按钮时显示[关闭]
【发布时间】:2013-01-25 11:18:51
【问题描述】:

如果有这两个表:

漫画

Field          Type                   Comment
comic_id       bigint(10)             unsigned NOT NULL
comic_title    varchar(500)           NULL

评分

Field               Type               Comment
rating_id           bigint(10)         unsigned NOT NULL
comic_id            varchar(250)       NULL
rating              varchar(250)       NULL

现在我想创建一个 API 来代表评分返回按 NextPrevious 按钮时评分最高的漫画。

  1. 默认情况下,API 返回评分最高的漫画。然后按下下一个按钮我应该如何计算最低平均评分漫画

  2. 同样如此,我将如何计算按下后退按钮时漫画的最高平均评分。

简而言之,我想创建一个Next previous Button that will show avg rating from rating table on behalf of comic id

【问题讨论】:

  • 请正确解释自己。这是一个非常令人困惑的问题
  • 听起来不错。继续前进,当你卡在某个地方时回到这里
  • SQL和按钮在一个问题中没有多大意义
  • @UmairAkhtar 这些表架构是新的还是现有的?我想我明白了你的问题
  • 好的,让我在这里向您展示 Schema:对于这些令人困惑的问题,我很抱歉,我是新手..

标签: mysql sql left-join


【解决方案1】:

您可以先从这里开始,尽管您的问题很可能会被关闭....该示例基于通常的场景,因为我们无法获取太多信息来帮助您解决问题...

这是How to post a question on SO的提示。

* SQLFIDDLE DEMO

试用示例:

select c.comic_id, c.comic_title, 
COUNT(r.comic_id), avg(r.ratings)
from comics c
left join rating r
on r.comic_id = c.comic_id
group by c.comic_id
;

| COMIC_ID | COMIC_TITLE | COUNT(R.COMIC_ID) | AVG(R.RATINGS) |
---------------------------------------------------------------
|      100 |           a |                 3 |              5 |
|      200 |           b |                 4 |            6.5 |
|      300 |           c |                 3 |         5.6667 |
|      400 |           d |                 2 |              8 |

平均:

select x.comic_id, x.comic_title,
min(average) from (
select c.comic_id, c.comic_title, 
COUNT(r.comic_id), avg(r.ratings) average
from comics c
left join rating r
on r.comic_id = c.comic_id
group by c.comic_id) x
;

| COMIC_ID | COMIC_TITLE | MIN(AVERAGE) |
-----------------------------------------
|      100 |           a |            5 |

根据 OP 的评论进行编辑:

OP想要排名最低,第二低等等..最高等级,第二高..等等

此查询将使用variable 进行排名。

* SQLFIDDLE DEMO

查询:

select x.comic_id, x.comic_title,
x.average from (
select (@rank:=@rank+1) as rank, c.comic_id, c.comic_title, 
COUNT(r.comic_id), avg(r.ratings) average
from (select @rank:=0) rk, comics c
left join 
rating r
on r.comic_id = c.comic_id
group by c.comic_id
order by average asc) x
where x.rank = 1
;

| COMIC_ID | COMIC_TITLE | AVERAGE |
------------------------------------
|      100 |           a |       5 |

为了熟悉JOIN,你可以看看这篇文章:VISUAL REPRESENTATION OF SQL JOINS

【讨论】:

  • 如果我想取出comic_id的下一个最低评分怎么办? & 如果我想取出以前最高的comic_id评分怎么办?
  • @UmairAkhtar 你想给他们排名最低,次低等等吗?最高也一样吗? =)
  • 如果comic_id在comic_rating表中没有记录怎么办???我也想展示那些评分为 0 的漫画记录
  • 当您在comics 表上使用left join 时,它将从该表中获取所有comics id。我现在正在更新排名的答案。
  • 您可以使用Coalesce(col,0) 显示0 当列将null 归零时,在您的情况下,如果漫画ID 没有评级..
【解决方案2】:

创建一个视图以使其更容易:(更新以包括没有评级的漫画)

CREATE VIEW avg_comic_rating AS 
SELECT 
    comics.comic_id, comics.comic_title, COALESCE(AVG(comic_rating), 0.0)AS avg_rating
 FROM
    comics LEFT JOIN comic_rating
ON   (comics.comic_id = comic_rating.comic_id)
GROUP BY comics.comic_id;

然后使用 Limit offsets 进行分页:

select * from avg_comic_rating order by avg_rating desc, comic_title asc limit 0,2;
+----------+-------------+------------+
| comic_id | comic_title | avg_rating |
+----------+-------------+------------+
|        6 | zorro       |     7.5000 |
|        5 | super man   |     7.0000 |
+----------+-------------+------------+
2 rows in set (0.05 sec)


select * from avg_comic_rating order by avg_rating desc, comic_title asc limit 2,2;
+----------+-------------+------------+
| comic_id | comic_title | avg_rating |
+----------+-------------+------------+
|        4 | cat woman   |     4.5000 |
|        2 | he man      |     4.5000 |
+----------+-------------+------------+
2 rows in set (0.00 sec)

表格内容供参考:

select * from comics;
+----------+-------------+
| comic_id | comic_title |
+----------+-------------+
|        1 | batman      |
|        2 | he man      |
|        3 | she man     |
|        4 | cat woman   |
|        5 | super man   |
|        6 | zorro       |
+----------+-------------+
6 rows in set (0.00 sec)

select * from comic_rating;
+-----------+----------+--------------+
| rating_id | comic_id | comic_rating |
+-----------+----------+--------------+
|         1 |        1 |            2 |
|         2 |        2 |            3 |
|         3 |        3 |            1 |
|         4 |        4 |            4 |
|         5 |        5 |            6 |
|         6 |        6 |            5 |
|         7 |        1 |            5 |
|         8 |        2 |            6 |
|         9 |        3 |            7 |
|        10 |        4 |            5 |
|        11 |        5 |            8 |
|        12 |        6 |           10 |
+-----------+----------+--------------+
12 rows in set (0.00 sec)

select * from avg_comic_rating;
+----------+-------------+------------+
| comic_id | comic_title | avg_rating |
+----------+-------------+------------+
|        1 | batman      |     3.5000 |
|        2 | he man      |     4.5000 |
|        3 | she man     |     4.0000 |
|        4 | cat woman   |     4.5000 |
|        5 | super man   |     7.0000 |
|        6 | zorro       |     7.5000 |
+----------+-------------+------------+
6 rows in set (0.00 sec)

【讨论】:

  • 非常感谢.. 我在这里有一个问题:如果comic_id 在comic_rating 表中没有记录怎么办?我也想展示那些评分为 0 的漫画记录
  • @UmairAkhtar 不错的收获;因为您需要更改视图创建语句。修改了帖子中的DDL。
猜你喜欢
  • 2016-07-03
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2020-03-29
  • 1970-01-01
  • 1970-01-01
  • 2019-08-21
相关资源
最近更新 更多