0

一些朋友拉我写了一个 IRC 机器人来帮助监控全天的液体消耗。我们频道中的每个用户每次喝东西时都可以提交以升为单位的数量,该值将存储在drinks_today 表中,该表在一天结束时重置。该机器人使用 SQLite 进行数据存储。

我坚持使用仅 SQL 的方式来找出当天排名前 3 位的饮酒者。

我有以下数据库表:

CREATE TABLE users(user_id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, active_days INTEGER DEFAULT 0, drinks_total FLOAT DEFAULT 0); 
CREATE TABLE drinks_today(user_id INTEGER, amount FLOAT, timestamp INTEGER, FOREIGN KEY(user_id) REFERENCES users(user_id));

我可以找到前 3 个 user_id,如下所示:

SELECT user_id,drinks_sum FROM ( SELECT SUM(amount) AS drinks_sum,user_id FROM drinks_today GROUP BY user_id ) ORDER BY drinks_sum DESC LIMIT 3;

结果将是:

1|9.0
4|8.5
3|6.0

现在我正在寻找一种方法来(正确地)将用户名映射到结果集中。我尝试了以下语句,但结果不正确:

SELECT u.name,drinks_sum FROM ( SELECT SUM(d.amount) AS drinks_sum FROM drinks_today d GROUP BY d.user_id) JOIN users AS u ON u.user_id=user_id ORDER BY drinks_sum DESC LIMIT 3;

结果集将包含 users 表的前三个用户,每个用户都将配备一个最高分。当然,这是完全错误的。

如何将用户名放入我的结果集中?

4

1 回答 1

2

认为您可以一次性完成所有操作。

SELECT u.user_id, u.name, SUM(d.amount) as drunk
FROM users u
INNER JOIN drinks_today dt ON dt.user_id = u.user_id
GROUP BY u.user_id, u.name
ORDER by drunk DESC -- or maybe ORDER BY SUM(d.amount) DESC
LIMIT 3

编辑

负责任地享受。

干杯。

于 2013-07-02T12:46:11.237 回答