【发布时间】:2017-05-09 10:28:16
【问题描述】:
我有一个系统,用户可以通过不同类型的贡献获得 1 个或多个积分。这些存储在 2 个表中:
CREATE TABLE user_contribution_types (
type_id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT,
title VARCHAR(255) NOT NULL,
credits DECIMAL(5,2) UNSIGNED NOT NULL,
valid TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
PRIMARY KEY (type_id)
);
CREATE TABLE user_contributions (
user_id INTEGER UNSIGNED NOT NULL,
type_id INTEGER UNSIGNED NOT NULL,
create_date DATETIME NOT NULL,
valid TINYINT(1) UNSIGNED NOT NULL DEFAULT 1,
FOREIGN KEY (user_id)
REFERENCES users(user_id),
FOREIGN KEY (type_id)
REFERENCES user_contribution_types(type_id)
);
我可以选择自特定日期以来获得的总积分:
SELECT SUM(credits) AS total
FROM user_contribution_types AS a
JOIN user_contributions AS b ON a.type_id = b.type_id
WHERE b.create_date >= '2017-05-01 00:00:00'
AND a.valid = TRUE
AND b.valid = TRUE
同样,我可以为 b.user_id 添加匹配项,以查找该特定用户的总积分。
我想做的是将获得的每个积分视为赠品的一个条目,并从总数中选择 3 个随机(唯一)user_ids。因此,如果一位用户获得了 26 个积分,他们将有 26 次获胜的机会。
如何使用 SQL 完成此操作,或者在应用程序级别执行此操作是否更有意义?我更喜欢尽可能接近真正随机的解决方案。
【问题讨论】: