我有一個系統,用戶可以爲不同類型的貢獻獲得一個或多個積分。這些存儲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',但我修復了別名。 –