我创建了两个表(仅显示了相关信息)
CREATE TABLE levels
(
id INT(6) UNSIGNED AUTO_INCREMENT,
gameid INT(6),
created DATETIME,
PRIMARY KEY(id,gameid)
)
CREATE TABLE votes
(
levelid INT(6) NOT NULL REFERENCES levels(id),
vote TINYINT(1),
date TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
PRIMARY KEY(levelid)
)
用户可以对级别(+1或-1)进行投票,从而创建指向该级别的投票记录。
我要对数据执行的操作是这样,非语法:
SELECT * FROM levels ORDER BY
(select sum(vote) from votes where votes.levelid=levels.id and date is within the last week)
如何将其转换为合法的mySQL查询?我尝试的所有操作都会给我一条异常神秘的错误消息(“出了点问题!请查阅手册!”),而且我只是mySQL的高级入门者。
我们的目标是归还我所有的级别,并按照上周票数总和最高的人进行排序...这样,新级别将继续前进,旧级别将逐渐消失。
提前致谢!
编辑:
因此,这是预期结果的示例:
这是我的数据(为清晰起见,以英语显示):
级别:
LEVEL1(id = 1)
等级2(id = 2)
票数:
两天前为LEVEL1 +1
十天前为LEVEL1 +1
二十天前为LEVEL1 +1
一天前为LEVEL2 +1
三天前为LEVEL2 +1
三十天前为LEVEL2 -1
所以我可以这样查询:
SELECT * FROM LEVELS ORDER BY (select sum(vote) from votes where levelid=levels.id)
这样我的LEVEL1为+ 3,LEVEL2为+1。
但是,在过去的7天里,我应该看到+1(对于LEVEL1)和+2(对于LEVEL2),因此首先返回LEVEL2。
另外,我得到的一般想法是“按(select ...)排序”会非常慢。
再修改一次:
该查询有效:
SELECT * FROM levels ORDER BY (SELECT SUM(vote) FROM votes WHERE levelid=levels.id AND votes.date>=( CURDATE() - INTERVAL 7 DAY )) DESC
...但这是做这种事情的最好方法吗?
最佳答案
您可以使用左联接来执行此操作:
SELECT levels.*, coalesce(sum(votes.vote),0) as total_vote
FROM levels
LEFT JOIN votes ON votes.levelid = levels.id
WHERE votes.date >=( CURDATE() - INTERVAL 7 DAY ))
GROUP BY levels.id
ORDER BY coalesce(sum(votes.vote),0) desc;
此处的合并确保未投票的级别得到分数(而不是null)并正确排序。
关于mysql - 在另一个表中按行对行进行排序,以填充“最新动态”列表,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/34362244/