Выберите 2 соответствующих столбца на основе 3-го столбца - PullRequest
0 голосов
/ 06 ноября 2018

Я хочу сопоставить идентификаторы столбца 1 из столбца 2.

_________________________________
| 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 голосов
/ 06 ноября 2018

Отличный вопрос. Из-за структуры данных в этой таблице вы можете сделать это, присоединив таблицу к себе. У вас будет два набора данных, реплики друг друга.

Вы хотите убедиться, что существует двустороннее соответствие между 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');
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...