我有两个表,因此创建(仅显示相关信息)
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
......但这是做这种事情的最好办法吗?
答案 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;
此处的合并可确保尚未投票的等级获得分数(而不是空)并正确排序。