在另一个表中按行对行进行排序以填充"什么是Hot"名单

时间:2015-12-18 18:57:44

标签: mysql sorting

我有两个表,因此创建(仅显示相关信息)

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)
LEVEL2(id = 2)

票:
两天前LEVEL1 +1 10天前LEVEL1 +1 二十天前LEVEL1 +1 一天前为LEVEL2 +1 三天前为LEVEL2 +1 -1天为LEVEL2三天前

所以我可以这样做一个查询:

SELECT * FROM LEVELS ORDER BY (select sum(vote) from votes where levelid=levels.id) 

这使得LEVEL1为+3,LEVEL2为+1。

但是,在过去的七天里,我应该看到LEVEL1为+1,LEVEL2为+2,因此首先返回LEVEL2。

另外,我得到了一般的想法"顺序(选择......"会很慢。

再一次编辑:

此查询有效:

SELECT * FROM levels ORDER BY (SELECT SUM(vote) FROM votes WHERE levelid=levels.id AND votes.date>=( CURDATE() - INTERVAL 7 DAY )) DESC

......但这是做这种事情的最好办法吗?

1 个答案:

答案 0 :(得分:0)

您可以使用左连接执行此操作:

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;

此处的合并可确保尚未投票的等级获得分数(而不是空)并正确排序。