我想知道是否有一种方法可以创建一个 sql 命令,该命令可以按(喜欢减去不喜欢)对在某个时间范围内完成的行进行排序。下面的例子展示了当我只有喜欢时我是如何做到这一点的(它有效),但是当考虑到不喜欢时它对我来说变得复杂了。
SELECT count(likes.lid) as 'amount', posts.* FROM likes
join posts on posts.pid = likes.pid
WHERE likes.DateLiked >= DATE_ADD(CURRENT_DATE, INTERVAL -3 DAY)
group by likes.pid order by amount DESC;
我目前有三个表:
CREATE TABLE posts (
pid int(11) AUTO_INCREMENT PRIMARY KEY,
uid int(11) not null,
Content text not null,
Category varchar(100) not null,
Subject varchar(100) not null,
DatePublished datetime not null,
TypeData VARCHAR(100) NOT NULL DEFAULT 'none',
Data VARCHAR(500) NOT NULL
);
CREATE TABLE likes (
lid int(12) AUTO_INCREMENT PRIMARY KEY,
uid int(11) NOT NULL,
Username varchar(200) NOT NULL,
pid int(11) NOT NULL,
DateLiked DateTime NOT NULL,
ipConnect varchar(200) NOT NULL
)
CREATE TABLE dislikes (
lid int(12) AUTO_INCREMENT PRIMARY KEY,
uid int(11) NOT NULL,
Username varchar(200) NOT NULL,
pid int(11) NOT NULL,
DateLiked DateTime NOT NULL,
ipConnect varchar(200) NOT NULL
);
我正在寻找一个命令,它可以在特定时间范围内按最高评分(喜欢-不喜欢)对帖子进行排序(即,如果有人在 2 天前喜欢它,但一年前不算)。
感谢任何帮助, 祝你有美好的一天。
最佳答案
先聚合,后加入:
select
coalesce(l.cnt, 0) - coalesce(dl.cnt, 0) as likes,
p.*
from posts p
left join
(
select pid, count(*) as cnt
from likes
where dateliked >= date_add(current_date, interval -3 day)
group by pid
) l on l.pid = p.pid
left join
(
select pid, count(*) as cnt
from dislikes
where dateliked >= date_add(current_date, interval -3 day)
group by pid
) dl on dl.pid = p.pid
order by coalesce(l.cnt, 0) - coalesce(dl.cnt, 0) desc;
关于mysql - phpmyadmin 排序依据(喜欢在 x 时间内完成-不喜欢在 x 时间内完成),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44547566/