1

比方说,我的数据库中有一个这样的表,无论是在 POSTGRESQL 还是 MYSQL 中:-

video_clip_name | bad | so_so | good|
video 1         | 20  | 13    | 3   |
video 2         | 12  | 20    | 33  |
video 3         | 40  | 34    | 33  |
video 4         | 20  | 23    | 13  |
video 5         | 20  | 13    | 37  |

在对三列(bad、so_so 和 good)进行比较后,我想根据最高分确定哪个视频被评为 bad、so_so 或 good 。假设视频 1 的评分低于其他两列。这意味着视频 1 的评分为差。

所以我的问题是如何在 POSTGRESQL/MYSQL 中编写这样的 SQL 语句,以根据三列值之间的比较来输出每个视频的总体评分?

谢谢你

4

4 回答 4

3

我来自 MySQL 方面,但我认为以下内容也应该在 Postgres 中工作:

SELECT video_clip_name, CASE GREATEST(bad, so_so, good)
   WHEN bad   THEN 'bad'
   WHEN so_so THEN 'so_so'
   WHEN good  THEN 'good'
END AS rating
FROM table;

但是,如果视频的最高评分出现在多个评分中(例如bad= 40、so_so= 20、good= 40),您并没有定义应该发生什么;在这种情况下,上面的代码总是更喜欢它在 中遇到的第一个匹配项CASE(即bad优先so_sogood)。

于 2012-04-28T19:42:05.513 回答
1

许多收集评级的网站会根据收到的评级计算代表项目整体受欢迎程度的数字分数。除非您计算某种数值平均值,否则很难比较两个或多个项目的相对受欢迎程度。Evan Miller 的这篇文章将帮助您应用一个 SQL 公式,该公式在您的计算背后提供了一些严格的统计信息。在其中,他说明了以下问题陈述的一个很好的解决方案(以及几个不太好的解决方案):

你是一个网络程序员。你有用户。您的用户对您网站上的内容进行评分。你想把评分最高的东西放在顶部,把评分最低的东西放在底部。你需要某种“分数”来排序。

于 2012-04-28T19:57:56.163 回答
0

我不熟悉 mysql 或 postgresql 的语法细节,但对我来说,它看起来像一组 if 语句,例如;

if bad > so_so then
  if bad > good then 'bad'
  else 'good'
  end if
else if so_so > good then 'so so'
else 'good'
end if 

当然,您需要围绕它进行正确的选择。这是假设每个录像带只有一行。

于 2012-04-28T19:46:34.370 回答
0

CASE这是使用表达式的另一种方式。我使用 SQL Server 而不是 MySQL 或 PostGreSQL,但我认为这符合 ANSI SQL。样本数据和输出使用各种值。但是,如果它们都是平等的,它目前会按照bad、 *so_so* 和good的顺序选择评级。

脚本

CREATE TABLE dbo.VideoRatings 
(
        video_clip_name VARCHAR(10) NOT NULL
    ,   bad             INT         NOT NULL
    ,   so_so           INT         NOT NULL
    ,   good            INT         NOT NULL
);

INSERT INTO  dbo.VideoRatings (video_clip_name, bad, so_so, good) VALUES
    ('video a', 1, 2, 3),
    ('video b', 2, 3, 1),
    ('video c', 3, 2, 1),
    ('video d', 2, 1, 1),
    ('video e', 1, 2, 2),
    ('video f', 1, 1, 2),
    ('video g', 2, 2, 2);

SELECT  video_clip_name
    ,   CASE 
            WHEN bad    >= so_so    AND bad     >= good     THEN 'bad'
            WHEN so_so  >= bad      AND so_so   >= good     THEN 'so_so'
            WHEN good   >= bad      AND good    >= so_so    THEN 'good'
        END AS Rating
FROM    dbo.VideoRatings;

输出

video_clip_name rating
--------------- ------
video a         good
video b         so_so
video c         bad
video d         bad
video e         so_so
video f         good
video g         bad
于 2012-04-28T19:50:51.963 回答