我要匹配第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`)
);
但是上面的代码也显示了未经检查的结果。
答案 0 :(得分:1)
很好的问题。由于此表中数据的结构,您可以通过将表与其自身连接来完成此操作。您将拥有两组数据,彼此为副本。
您要确保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用户询问这些问题时,很高兴提供它。
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');