急求一条sql语句写法

fangshuguang 发布于 2016/09/23 08:34
阅读 431
收藏 0

from_uid 和 to_uid 去重只只保留他们match_rate 最高的

不知道SQL能不能实现,或者要实现这种查询,可有更好的表结构设计

要实现结果:

加载中
0
太黑_thj
太黑_thj
先根据uid进行分组  然后max(matchrate)就可以了
0
JeffreyLin
JeffreyLin

select t1.* from tb_party_light_both t1,
(
select distinct max(t1.id) id from tb_party_light_both t1,
(
select uid, max(match_rate) match_rate from
(
select from_uid uid, max(match_rate) match_rate from tb_party_light_both t group by t.from_uid
union
select to_uid uid, max(match_rate) match_rate from tb_party_light_both t group by t.to_uid
) t group by uid
) t2
where t1.from_uid=t2.uid or t1.to_uid=t2.uid and t1.match_rate=t2.match_rate
group by t2.uid
) t2
where t1.id=t2.id






JeffreyLin
JeffreyLin
回复 @fangshuguang : 见后面的另一个回复
f
fangshuguang
回复 @JeffreyLin : 谢谢! 场景是这样:相亲有亮灯环节,表中记录了彼此亮过灯的,然后将这些彼此亮过灯的请上台取礼品,但一个人有可能和其它几个人都彼此亮过灯,只取他们彼此匹配分数最高的上台,最低的直接忽略不上台
JeffreyLin
JeffreyLin
回复 @fangshuguang : 这样啊,那有点不理解你的需求了,或者你补充一下应用场景描述吧
f
fangshuguang
回复 @JeffreyLin : 没有漏,因为31121和10003他们没有交集
f
fangshuguang
谢谢,但实现结果还不是想要的 to_uid 中还有和 from_uid 重复的数据 ,最终结果如第2张图,只保留ID=2 和 4 的数据
下一页
0
求是科技
求是科技

需求分析:

用户A与用户B的亮灯问题(假设用户A 10000,用户B 10001),用户A可以给用户B亮灯多次,反之,用户B也可以给用户A亮灯多次。

用户A给用户B亮灯-->记录表10000 10001 1

用户B给用户A亮灯-->记录表10001 10000 1

这个时候C来了,他可以给A亮灯,也可以给B亮灯,同时A、B也可以给C亮灯。 

假设

1.A给B亮灯100次,B给A亮灯90

2.A给C亮灯90,C给A亮灯80

3.B给C亮灯80,C给B亮灯70

  则数据库查询出来的记录应该是A、B,即应该是A和B上台领奖?



求是科技
求是科技
回复 @求是科技 : 只能降序,不能分组,分组降序会将同票数的另外一个不相关的对去掉了。
求是科技
求是科技
解决方案 1.按照亮灯数分组,降序排列,第一条记录肯定是亮灯数最多的那一对。 2.上述两个用户领奖了,就应该从数据库删除了,即删除上述两个用户的所有记录。 3.循环1和2就可以得到你所需的结果。
0
黑牙菜菜
黑牙菜菜

假设表名叫ft 

SELECT DISTINCT(a.id) id,	a.from_uid,	a.to_uid,	a.match_rate
FROM(
		SELECT	uid,	max(match_rate) AS match_rate
		FROM(
				SELECT	from_uid uid,	match_rate	FROM	ft		
				UNION
				SELECT	to_uid uid,	match_rate	FROM	ft
			) AS t
		GROUP BY
			uid
		HAVING
			count(uid) > 1
	) AS b,	ft AS a
WHERE
	a.match_rate = b.match_rate AND (a.from_uid = b.uid OR a.to_uid = b.uid);



0
JeffreyLin
JeffreyLin
select distinct
case when t1.uid<t1.max_match_uid then t1.uid else t1.max_match_uid end uid1,
case when t1.uid>t1.max_match_uid then t1.uid else t1.max_match_uid end uid1,
t1.max_rate
from 
(
select t1.uid, case when t1.uid=t2.from_uid then t2.to_uid else t2.from_uid end max_match_uid, t1.max_rate from 
(
select uid, max(max_rate) max_rate from
(
select from_uid uid, max(match_rate) max_rate FROM tb_party_light_both group by from_uid
UNION
select to_uid uid, max(match_rate) max_rate from tb_party_light_both group by to_uid
) t group by uid order by max_rate
) t1
join tb_party_light_both t2 on (t1.uid=t2.from_uid or t1.uid=t2.to_uid) and t1.max_rate=t2.match_rate
) t1,


(
select t1.uid, case when t1.uid=t2.from_uid then t2.to_uid else t2.from_uid end max_match_uid, t1.max_rate from 
(
select uid, max(max_rate) max_rate from
(
select from_uid uid, max(match_rate) max_rate FROM tb_party_light_both group by from_uid
UNION
select to_uid uid, max(match_rate) max_rate from tb_party_light_both group by to_uid
) t group by uid order by max_rate
) t1
join tb_party_light_both t2 on (t1.uid=t2.from_uid or t1.uid=t2.to_uid) and t1.max_rate=t2.match_rate
) t2
where t1.max_rate=t2.max_rate and t1.uid=t2.max_match_uid and t1.max_match_uid=t2.uid
order by max_rate desc

另外,你还要考虑匹配度相等的情况怎么处理(假如 10003 和 10001 的匹配度也是 100 呢?)
JeffreyLin
JeffreyLin
这个算法好像还是有 bug,建议还是考虑用程序或存储过程实现吧
0
f
fgod

from 和 to 是双向的,a可以亮b,b可以亮a, match数量在一个表中只是单向指数;

如果需求最终需要将a 选择 b 的match数 与 b选择a 的match数做合并得到一个最终match指数,

那么我觉得或许可以维护一个统计表,字段设计:

 peopple a ; people b;

 a_matchTo_b  指数c; b_match_a  指数d

 final_match  最终指数e;



0
f
fangshuguang
感谢以上回答的各位,虽然没达到最终效果,还是要感谢
0
s
sunxueyang222
SELECT * FROM (
    SELECT *,ROW_NUMBER()OVER(PARTITION BY from_uid,to_uid ORDER BY match_rate desc)rows FROM     XXXXXXX(表名) 
) AS base WHERE rows=1
返回顶部
顶部