在第3列的基础上选择2个匹配的列

时间:2018-11-06 15:09:58

标签: mysql sql

我要匹配第2列中第1列的ID。

_________________________________
| uid  |  profile_id |   status |
|------|-------------|-----------
|  1   |   2         |  checked |
|  2   |   1         |  checked |
|  3   |   4         | unchecked|
|  4   |   1         | unchecked|
|  4   |   3         |  checked |
|  1   |   4         |  checked |
           ...

这是我的桌子。我想显示从id1到id2匹配的相同值的结果,并检查状态。以下是输出:

__________________________
| uid  |  profile_id |   status |
|------|-------------|-----------
|  1   |   2         |  checked |
|  2   |   1         |  checked |
           ...

因为id1 1检查id2 2,反之亦然。

我完成了以下代码。

SELECT 
  `aa`.`uid` AS `uid`, 
  `aa`.`profile_id` AS `profile_id`, 
  `aa`.`match_type` AS `match_type` 
FROM 
  (
    `matched_profiles` `aa` 
    left join `matched_profiles` `ab` on(
      (`aa`.`uid` = `ab`.`profile_id`)
    )
  ) 
where 
  (
    (`aa`.`uid` = `ab`.`profile_id`) 
    and (`ab`.`uid` = `aa`.`profile_id`)
  );

但是上面的代码也显示了未经检查的结果。

1 个答案:

答案 0 :(得分:1)

很好的问题。由于此表中数据的结构,您可以通过将表与其自身连接来完成此操作。您将拥有两组数据,彼此为副本。

您要确保uidprofile_id之间存在双向匹配。 您还希望两个方向的状态均为checked

SELECT 
 a.* 
FROM matched_profiles a
inner join matched_profiles a2 on 
    a.uid = a2.profile_id 
    and a.profile_id = a2.uid  
    and a.status = 'checked' 
    and a2.status = 'checked';

您正在进行一种显式/隐式连接。为了清楚起见,我重新格式化为完全明确。您只需要添加一个过滤器,以确保所有status的值都是checked

下面是构建您的测试架构的SQL,当向SO用户询问这些问题时,很高兴提供它。

create table matched_profiles (
  uid int, 
  profile_id int, 
  status varchar(18)
);
insert into matched_profiles 
values 
  (1, 2, 'checked'), 
  (2, 1, 'checked'), 
  (3, 4, 'unchecked'), 
  (4, 1, 'unchecked'), 
  (4, 3, 'checked'), 
  (1, 4, 'checked');