有关自我加入的问题。查看两个用户是否互动

时间:2019-05-29 06:42:37

标签: mysql sql

我获得了一个SQL赋值,该赋值是下表模拟约会应用程序的表:表名=约会

user_id | viewing_profile_id | date | liked
   1              2             x       yes
   1              3             x       yes
   2              1             x       yes
   2              3             x       no
   3              1             x       no
   3              2             x       no

基本上,我想查看彼此匹配的配置文件的百分比。匹配是两个配置文件彼此相似时。

我想我知道我该怎么办。在表本身上执行自我连接,并在配置文件彼此相似时使用case。

select t.date, sum(t.match) / count(t.match) as p_match
from (
select s1.user_id, s1.viewing_profile_id, 
date_trunc('day',s1.date) as date, case when s1.liked = 'yes' 
and s2.liked = 'yes' then 1 else 0 end as match
from dating s1
left join dating s2 on s2.ser_id = s1.viewing_profile_id
group by 1,2) t
group by 1

由于这只是一个组合表,并且我没有任何数据可以执行,所以我想知道我是否可以对此有所了解。

我希望子查询产生如下所示的内容:

user_id | viewing_profile_id | date | match
   1              2             x       1
   1              3             x       0
   2              1             x       1
   2              3             x       0
   3              1             x       0
   3              2             x       0

3 个答案:

答案 0 :(得分:1)

您需要在满足以下条件的情况下自行离开表:

select 
  d1.*,
  case when d2.user_id is null then 0 else 1 end `match`
from dating d1 left join dating d2
on 
  d1.user_id = d2.viewing_profile_id 
  and d1.viewing_profile_id = d2.user_id
  and d1.liked = 'yes' and d2.liked = 'yes'
order by d1.user_id, d1.viewing_profile_id  

请参见demo
结果:

| user_id | viewing_profile_id | date | liked | match |
| ------- | ------------------ | ---- | ----- | ----- |
| 1       | 2                  |      | yes   | 1     |
| 1       | 3                  |      | yes   | 0     |
| 2       | 1                  |      | yes   | 1     |
| 2       | 3                  |      | no    | 0     |
| 3       | 1                  |      | no    | 0     |
| 3       | 2                  |      | no    | 0     |

答案 1 :(得分:0)

/* for matched users*/
SELECT *
FROM user viewed, user viewing
WHERE viewed.user_id = viewing.viewing_profile_id
and viewed.liked='yes'
and viewing.liked='yes'


/* for Match_Percentage */
SELECT 
(SELECT count(*)
FROM user viewed, user viewing
WHERE viewed.user_id = viewing.viewing_profile_id 
and viewed.liked='yes'
and viewing.liked='yes')
/
(SELECT count(*) FROM user)
*100 as Match_Percentage
FROM dual;

答案 2 :(得分:0)

如果只需要一个标志来指定反向匹配,那么:

select d.*,
       (exists (select 1
                from dating d2
                where d2.user_id = d.viewing_profile_id and
                      d2.viewing_profile_id = d.user_id and
                      d2.liked = 'yes'
               ) and
        d.liked = 'yes'
       ) as match
from dating d;
相关问题