我正在尝试创建引荐代码基础结构。我想使用用户电子邮件中的前12个字符,并使用整数进行重复数据消除:
因此,给三个用户使用电子邮件bob@gmail.com
,bob@hotmail.com
和bob@yahoo.com
,我想生成代码bob
,bob1
和{{ 1}}。
我已经使用以下sql完成了此操作:
bob2
这很好,但是有两种边缘情况:
1)引荐代码必须是全局唯一的,因此将用户UPDATE user_referral_codes urc
SET referral_code = (
LEFT(LEFT(email, strpos(email, '@') - 1), 12)
|| (CASE WHEN seqnum > 1 THEN (seqnum-1)::TEXT ELSE '' END)
)
FROM (
SELECT
users.*,
row_number() OVER (
PARTITION BY LEFT(LEFT(email, strpos(email, '@') - 1), 12)
ORDER BY id
) AS seqnum
FROM users
) AS u
WHERE urc.user_id = u.id;
和bob1@gmail.com
添加到组合中将导致以下配对:
bob2@gmail.com
我该如何解决?
2)还有第二个代码,coupon_codes。我还如何确保此表不重复?
例如如果存在优惠券代码bob@gmail.com | bob
bob@hotmail.com | bob3
bob@yahoo.com | bob4
bob1@gmail.com | bob1
bob2@gmail.com | bob2
,那么bob2
也应该获得推荐代码bob2@gmail.com
?
示例架构:
bob21
示例选择查询显示当前(不完整)行为:
CREATE TABLE users(
id bigint NOT NULL PRIMARY KEY,
email TEXT NOT NULL UNIQUE
);
CREATE TABLE user_referral_codes(
user_id bigint NOT NULL REFERENCES users (id),
referral_code TEXT
);
CREATE TABLE coupon_codes(
code_id TEXT
);
INSERT INTO users(id, email) VALUES(1, 'bob@flockcover.com');
INSERT INTO users(id, email) VALUES(2, 'bob@google.com');
INSERT INTO users(id, email) VALUES(3, 'bob@gmail.com');
INSERT INTO users(id, email) VALUES(4, 'bob1@gmail.com');
INSERT INTO user_referral_codes(user_id) VALUES(1);
INSERT INTO user_referral_codes(user_id) VALUES(2);
INSERT INTO user_referral_codes(user_id) VALUES(3);
INSERT INTO user_referral_codes(user_id) VALUES(4);
INSERT INTO coupon_codes(code_id) VALUES('bob2');
sqlfiddle链接演示问题: http://sqlfiddle.com/#!17/0a6ea