我有一个系统,用户可以为不同类型的贡献获得一个或多个积分。这些存储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_id
秒。所以如果一个用户获得了26个学分,他们将有26个获胜机会。
这怎么可以用SQL来完成呢,还是在应用程序级别做更有意义呢?我宁愿选择尽可能接近真正随机的解决方案。
如果我理解正确,您的第一个示例可以与应用程序级逻辑结合使用?所以我可以将它包装到一个函数中并将结果传回给它自己?即,'WHERE user_id不在($ winners)'中。这将完全排除重复的结果... –
此外,我收到此错误:'字段列表'中的未知列'uc.user_id' –
@mistermartin。 。 。该列在您的问题中指定。你可能已经错过了你。user_id',但我修复了别名。 –