사용자가 다양한 유형의 기여에 대해 1 개 이상의 크레딧을 얻을 수있는 시스템이 있습니다.곱한 결과에서 임의의 고유 값을 선택하는 방법
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)
);
나는 다음과 특정 날짜 이후에 취득한 총 학점 선택할 수 있습니다 :이 2 개 테이블에 저장되어 마찬가지로
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로 어떻게 수행 할 수 있습니까? 아니면 응용 프로그램 수준에서 수행하는 것이 더 합리적입니까? 나는 가능한 한 정말로 무작위적인 것에 가까운 해결책을 선호 할 것이다.
정확하게 이해하면 첫 번째 예가 응용 프로그램 수준 논리와 함께 사용될 수 있습니까? 그래서 함수로 랩핑하고 그 결과를 다시 자신에게 전달할 수 있습니까? 즉,'user_id가 아닌 곳 ($ winners)'. 그리고 그게 완전히 중복 결과를 배제 할 것입니다 ... –
또한이 오류가 발생합니다 : '필드 목록'에서 알 수없는 열 'uc.user_id' –
@ mistermartin. . . 해당 열은 귀하의 질문에 명시되어 있습니다. 당신은'u를 잃어 버렸을지도 모른다.user_id'하지만 별칭을 수정했습니다. –