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

cld4siwp  于 2021-06-18  发布在  Mysql
关注(0)|答案(1)|浏览(332)

我要匹配第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 |
           ...

这是我的table。我想显示从id1到id2匹配的相同值的结果,并且状态为checked。输出如下:

__________________________
| 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`)
  );

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

tv6aics1

tv6aics11#

好问题。由于该表中数据的结构,您可以通过将该表连接到自身来实现这一点。您将拥有两组数据,它们是彼此的副本。
你想确定他们之间有双向匹配吗 uid 以及 profile_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用户询问这些问题时,可以很好地提供这些sql。

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');

相关问题