2

我正在尝试根据所有其他视频的观看次数来获取我在数据库中拥有的每个视频的百分比。

然后,我尝试显示从最高观看次数到最低观看次数的所有视频,并在漂亮的 HTML 页面内显示其百分比。

显然,百分比的范围是 0 - 100%(而不是超过),我认为最受欢迎的视频可能是 100%。

我的数据库中有大约 3,400 个视频。我的尝试很可笑,现在已经摸不着头脑了。

我的桌子看起来与此类似。

video_public
id | video_title | video_views

试图:

SELECT 
   id, 
   video_views * 100 / (SELECT COUNT(*) FROM video_public)
FROM `video_public` stat

老实说,我什至不知道这个 SQL 查询是否正确。

我什至没有考虑所有视频视图视频的视频视图..

真的卡住了。。

4

11 回答 11

6

好的,根据您对问题的澄清:

您想为数据库中的每个视频计算 (video_views * 100) / (largest_views_for_any_single_video)。

分子很简单,它只是 video_views 列。分母是

SELECT MAX(video_views) FROM video_public

所以,把它放在一起,你会得到:

SELECT video_title, ((video_views * 100) / (SELECT MAX(video_views) 
FROM video_public)) FROM video_public

对于观看次数最多的视频,这应该产生 100,其他视频的百分比较低,对于从未观看过的任何视频,该百分比应降至 0。

于 2009-11-19T17:34:08.833 回答
5

要修改sheepsimulator 的建议,您可以尝试:

SELECT 
    id, 
    video_title, 
    video_views, 
    (select sum(video_views) from video_public)) as TotalViews,
    ((100 * video_views)/(select sum(video_views) from video_public)) as PercentOfViews
FROM 
    video_public 
order by 
    video_views.

当然,更改订单以适合您的口味。

于 2009-11-19T15:25:15.677 回答
3

好吧,我首先要考虑一下您要寻找的东西:

我在数据库中的每个视频的百分比,基于它与所有其他视频的观看次数。

基本上,您想首先找到它的视图排名。为什么不根据视频观看次数对记录进行排序:

SELECT id, video_title, video_views
FROM video_public order by video_views DESCENDING

现在,我认为这就是你想要做的,就是只显示其中的一部分,比如前 10%?然后,您想为每条记录分配一个percentile。这意味着对于您分配给视频的顺序,您希望将“顶行”(返回的第一个)设为 100%,而最后一行返回 0%。它为结果集中的每个项目提供 0 到 100 之间的数字。

计算你的百分位数:

SELECT id, 
       video_title, 
       video_views, 
       ((video_views * 100) / (select max(video_views) from video_public)) video_percentile
FROM video_public order by video_views DESCENDING

如果您只想显示前 10%,请尝试以下操作:

SELECT id, 
       video_title, 
       video_views, 
       ((video_views * 100) / (select max(video_views) from video_public)) video_percentile
FROM video_public
WHERE ((video_views * 100) / (select max(video_views) from video_public)) > 90
ORDER BY video_views DESCENDING

目前尚不清楚您在寻找什么,但我认为这可能会有所帮助。


编辑: 查看评论后,特别是 Riven 和 Larry Lustig 的评论,并重新阅读问题,我不得不说 video_views 的 sum() 不正确,所以我回去将 sum()s 更改为最大()秒。这将根据观看次数最多的视频为您提供一个百分比。

于 2009-11-19T15:18:12.930 回答
1

我认为最好在脚本中计算您的百分比,然后从数据库中检索视图计数。

于 2009-11-19T15:16:31.500 回答
1

运行两个选择:

 select max(video_views) FROM video_public

获得最大视图数,然后运行其他选择并计算脚本中的百分比。否则,子选择可能会针对每个结果行运行......这不是你想要的,性能方面。

另请注意,您必须使用max, 不是,sum或者count(*)因为您想知道“与我观看最多的视频相比,观看此视频的频率”。成像您观看每个视频一次和两次。百分比会是多少?100%?还是 0.0000001%?

于 2009-11-19T15:20:18.403 回答
1
select id, ((video_views * 100) / (select sum(views) from videos)) view_percent   from video_public

这将为您提供每个视频占总观看次数的百分比。

于 2009-11-19T15:21:06.447 回答
1

试试这个,它现在可以在 MySQL 中使用。

select id, video, views, ((views / (select sum(views) from video)) * 100) as Percentagess
from video

这是表格:

CREATE TABLE IF NOT EXISTS `video` (
  `ID` int(11) NOT NULL,
  `Video` varchar(50) NOT NULL,
  `Views` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Dumping data for table `video`
--

INSERT INTO `video` (`ID`, `Video`, `Views`) VALUES
(1, 'Hulk', 20),
(2, 'Jack', 30),
(3, 'The King', 24);

下面的代码适用于 SQL Server:

这是一个带有我刚刚写的临时表的游标。

声明 @total int set @total = (从视频中选择 sum(Views))

declare @videoid int
declare @video varchar(50)
declare @views int

declare @percentage decimal(18, 2)


IF  EXISTS (SELECT * FROM tempdb.sys.tables WHERE NAME LIKE '%tmp%')
DROP TABLE #tmp


--create temporary table
CREATE TABLE #tmp (VideoID int, VideoTitle varchar(50), Views int, Percentage decimal(18, 2))

DECLARE @videoPercent CURSOR
SET @videoPercent = CURSOR FOR 
    select id, video, views
    from video

OPEN @videoPercent

FETCH NEXT FROM @videoPercent INTO @videoid, @video, @views
WHILE @@FETCH_STATUS = 0
begin

    set @percentage = (convert(decimal(18,2), @views) / convert(decimal(18,2), @total)) * 100; 

    insert into #tmp(VideoID, VideoTitle, Views, Percentage)
    values(@videoid, @video, @views, @percentage);

    FETCH NEXT FROM @videoPercent INTO @videoid, @video, @views
end

select * from #tmp

CLOSE @videoPercent
DEALLOCATE @videoPercent

这是表格:

CREATE TABLE [dbo].[Video](
    [ID] [int] NOT NULL,
    [Video] [varchar](50) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL,
    [Views] [int] NOT NULL
)

用数据填写它,你准备好了。玩的开心。

于 2009-11-19T15:43:47.480 回答
1

如果您想计算 1 个查询中的百分比,请使用:

SELECT `vp1`.`id`, `vp1`.`video_views` * 100 / (SELECT MAX(`vp2`.`video_views`) FROM video_public AS `vp2`) FROM video_public AS `vp1`

当然,将中间结果存储在 PHP(或 SQL 变量)中并将其传递给下一个查询会更有效

$phpmax <= SELECT MAX(`vp2`.`video_views`) FROM video_public AS `vp2`
SELECT `vp1`.`id`, `vp1`.`video_views` * 100 / {$phpmax} ) FROM video_public AS `vp1`

==> 在查询中使用 SUM(views) 的每个人都有错误的结果!排名最高的视频应该是 100%,而不是所有视频总观看次数的百分比,因此您必须使用 MAX(views)

于 2009-11-19T17:23:02.087 回答
0

要记住的事情......到目前为止,所有答案都包括子查询,我认为这是不必要的。这些将针对您表中的每一行进行评估!

而是在外部执行此操作,例如

而不是这个:

select id, ((video_views * 100) / (select sum(views) from videos)) view_percent
from video_public

做这个:

declare @totalviews int
select @totalviews = sum(views) from videos

select id, (video_views * 100 / @totalviews) view_percent
from video_public

这应该运行得更快,并且对您的数据库的影响更小。

于 2009-11-19T15:48:34.070 回答
0

除非只有一个视频被观看,否则您的观看次数最多的视频不会达到 100%,但它会为您提供观看次数、该视频的观看次数占所有观看次数的比例以及观看次数的百分比与所有视频相比。


SELECT 
    Videos.id                     AS VideoID,
    video_views                   AS ViewCount,
    video_views / Total.ViewCount AS ViewRatio,
    Convert(varchar(6),Round(100.00 * video_views / Total.ViewCount, 2)) + '%' AS ViewPercentage
FROM 
    video_public AS Videos
CROSS JOIN 
    (SELECT Convert(float,Sum(video_views)) AS ViewCount FROM video_public) AS Total
ORDER BY
    video_views DESC
于 2009-11-19T15:59:18.650 回答
0

实现这一点的最简单方法实际上是使用两个单独的查询。我同意 Stuart 的观点,即子查询将对数据库性能产生负面影响,因为子查询将为返回的每条记录运行。

我要做的是运行查询以获取总视频观看次数并将结果存储在本地变量中。

SELECT SUM(video_views) FROM VIDEO_PUBLIC
如果您想要查看所有总视图的百分比

或者

SELECT MAX(video_view) FROM VIDEO_PUBLIC
如果您想要相对于最受欢迎视频的观看百分比。

接下来,运行查询以获取视频,按大多数观看次数排序:

SELECT id, video_title, video_views FROM VIDEO_PUBLIC ORDER BY video_views DESC

然后在代码中,您可以使用第一个查询的结果同时循环第二个查询的结果来计算每个视频的观看百分比。

我不确定您使用哪种语言进行显示,但在 C# 中它看起来像这样:

int totalViews = FirstQuery();
IEnumerable<Videos> videos = SecondQuery();
foreach (Video video in videos) {
    double totalPercentage = ((double)video.Video_Views / (double)totalViews) * 100)
}
于 2009-11-19T16:23:10.380 回答