我创建了两个表(仅显示了相关信息)

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/

10-15 10:47