我正在尝试弄清楚当我尝试在源表上进行内部联接时,我将如何确保只获得每个用户的一个实例及其ID。 源数据是一系列用户名和ID
userid username
1 alice
2 bob
3 charley
4 dave
5 robin
6 jon
7 lou
8 scott
我必须在python中编写算法,以确保我只获得一组用户数据与另一组匹配(因此我们可以确保每轮用户的数据使用一次) 我们存储配对,测试后成功完成了多少轮,但我想尝试简化流程 我可以获得所有结果,但我想找到一种更好的方法从结果中删除每个匹配的对,这样它们就无法再次匹配。
select u.user_id, u.user, ur.user_id, ur.user
from userResults u inner join userResults ur
on u.user_id < ur.user_id
and (u.user_id, ur.user_id) not in
(select uid, uid2 from rounds)
where u.match <= ur.match and ((u.user_id) not in %s
and ur.user_id not in %s) limit 1;
我尝试使用一个独特的约束来制作物化视图,但它似乎并没有影响它 - 我每次都可以配对一次,而不是每个用户只配对一次
我试图找出如何以正确的顺序获得4个结果。 每次我查看底层代码时,我都无法帮助,但认为在SQL中本地编写它是一种更好的方法,而不必在python中迭代结果。
修改的
假设每个用户已匹配0次或更多次,您可能会有一个位置,其中user_id 1-4的轮次设置为1,匹配设置为1,其余4个轮次设置为1和没有比赛。
我有一个视图,如果它们尚未播放,将返回默认值0和0的轮次和匹配,并且您不能假设所有输入的轮次都符合匹配。
如果前4个已全部匹配,并且已生成回合,则用户1和用户2已经在一轮中遇到并匹配,因此他们不会再次匹配,因此用户1将匹配用户3(或4)用户2将匹配用户4(或3) 我遇到的问题是,当我移除限制并手动迭代时 - 我总得到的前三个匹配是:2,4然后是1,3,然后是2,3(而不是5,7或6, 8)
添加样本数据和当前轮次 桌轮
uid uid2
1 2
3 4
用户结果视图
user_id user rounds score
1 alice 1 0
2 bob 1 1
3 charley 1 1
4 dave 1 0
5 robin 0 0
6 jon 0 0
7 lou 0 0
8 scott 0 0
我目前的结果如下:
2,4
2,3
1,3
1,4
4,6
...
这些都是有效的结果,但我想将它们限制在每列中每个ID的单个实例,所以只是每个有效配对的第一个匹配。
我已经创建了一个新视图来尝试和简化事物但是,并使用虚拟数据填充它并尝试生成匹配 所有这些匹配都是有效的,我试图添加某种形式的过滤器或限制,以使其恢复到合理的数字。
777;"Bongo Steveson";779;"Drongo Mongoson"
777;"Bongo Steveson";782;"Cheesey McHamburger"
777;"Bongo Steveson";780;"Buns Mattburger"
779;"Drongo Mongoson";782;"Cheesey McHamburger"
779;"Drongo Mongoson";781;"Hamburgler Bunburger"
775;"Bob Jobsworth";777;"Bongo Steveson"
778;"Mongo Bongoson";779;"Drongo Mongoson"
775;"Bob Jobsworth";778;"Mongo Bongoson"
778;"Mongo Bongoson";781;"Hamburgler Bunburger"
775;"Bob Jobsworth";782;"Cheesey McHamburger"
775;"Bob Jobsworth";781;"Hamburgler Bunburger"
775;"Bob Jobsworth";780;"Buns Mattburger"
776;"Steve Bobson";777;"Bongo Steveson"
776;"Steve Bobson";779;"Drongo Mongoson"
776;"Steve Bobson";782;"Cheesey McHamburger"
776;"Steve Bobson";778;"Mongo Bongoson"
776;"Steve Bobson";781;"Hamburgler Bunburger"
780;"Buns Mattburger";782;"Cheesey McHamburger"
780;"Buns Mattburger";781;"Hamburgler Bunburger"
我仍然无法通过明智的方式限制这些价值观,这让我疯狂。
我已经在代码中实现了一个解决方案,但我真的很想知道我是否可以在本地Postgres中使用它。
此时我正在使用新的测试数据库模式进行修改,这是我的观点 - 索引的唯一添加会生成错误,我无法在物化视图中添加检查约束(grrrr) )
答案 0 :(得分:0)
您可以尝试加入子查询以确保来自用户表的不同记录。
select * from any_table t1
inner join(
select distinct userid,username from source_table
) t2 on t1.userid=t2.userid;