PostgreSQL:按计算值的总和排序

我有一个提示,定义如下:

CREATE TABLE tips
(
  tip_id bigserial NOT NULL,tip text NOT NULL,author text NOT NULL,post_date bigint NOT NULL,likers character varying(16)[],dislikers character varying(16)[],likes integer NOT NULL,dislikes integer NOT NULL,abuse_history character varying(16)[]
);

我需要根据受欢迎程度获得提示,人气的定义是:
 喜欢 – 不喜欢 – (size(abuse_history)* 5)

无论排序顺序(ASC / DESC)如何,下面的查询都会给出相同的结果.

select * from tips order by (likes - dislikes - (array_length(abuse_history,1) * 5)) ASC limit 2147483647 offset 0

编辑

我插入了3条具有以下值的记录:
1)1喜欢,0不喜欢,0滥用投诉
2)0喜欢,1不喜欢,0滥用投诉
3)0赞,0滥用…

无论排序顺序(ASC / DESC)如何,我都会得到以下顺序:
{3,1,2}

有谁能请我指出正确的方向?

解决方法

考虑一下:

SELECT array_length('{}'::character varying(16)[],1);

空数组的输出为NULL.此外,您的abuse_history本身也可以为NULL.所以你需要这样的东西:

SELECT *
  FROM tips
 ORDER BY (likes - dislikes - COALESCE(array_length(abuse_history,1) * 5,0)) DESC;

反馈后编辑:

在Postgresql 9.0中工作,如本演示所示:

CREATE TABLE tips
( tip_id bigserial NOT NULL,tip text,author text,post_date bigint,likes integer,dislikes integer,abuse_history character varying(16)[]
);


INSERT INTO tips (likes,dislikes,abuse_history)
VALUES(1,'{}'),(1,(0,'{stinks!,reeks!,complains_a_lot}');


SELECT tip_id,likes,(likes - dislikes - COALESCE(array_upper(abuse_history,0)) as pop,(likes - dislikes - array_upper(abuse_history,1) * 5) as fail_pop
  FROM tips
 ORDER BY (likes - dislikes - COALESCE(array_upper(abuse_history,0)) DESC;

输出

tip_id | likes | dislikes | pop | fail_pop
--------+-------+----------+-----+----------
      1 |     1 |        0 |   1 |
      2 |     1 |        0 |   1 |
      4 |     0 |        0 |   0 |
      3 |     0 |        1 |  -1 |
      5 |     1 |        0 | -14 |      -14

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...