найти ту же запись для нескольких полей в mysql - PullRequest
0 голосов
/ 11 июля 2020
CREATE TABLE IF NOT EXISTS `userinfo` (
  `user_id` int(6) unsigned NOT NULL,
  `user_code` varchar(20),
  `party1_id` varchar(200),
  `party2_id` varchar(200),
  PRIMARY KEY (`user_id`)
) DEFAULT CHARSET=utf8;
INSERT INTO `userinfo` (`user_id`, `user_code`, `party1_id`, `party2_id`) VALUES
  ('1', '05B29E57', '1', ''),
  ('2', '05B29E58', NULL, '1'),
  ('3', '05B29E59', '2', ''),
  ('4', '05B29E60', NULL, '2'),
  ('5', '05B29E61', '3',''),
  ('6', '05B29E62', NULL, '3'),
  ('7', '05B29E63', NULL, '4'),
  ('8', '05B29E64', NULL, '5'),
  ('9', '05B29E65', NULL, '6'),
  ('10', '05B29E66', NULL, '7');
+---------+-----------+-----------+-----------+
| user_id | user_code | party1_id | party2_id |
+---------+-----------+-----------+-----------+
|       1 | 05B29E57  | 1         |           |
|       2 | 05B29E58  | NULL      |         1 |
|       3 | 05B29E59  | 2         |           |
|       4 | 05B29E60  | NULL      |         2 |
|       5 | 05B29E61  | 3         |           |
|       6 | 05B29E62  | NULL      |         3 |
|       7 | 05B29E63  | NULL      |         4 |
|       8 | 05B29E64  | NULL      |         5 |
|       9 | 05B29E65  | NULL      |         6 |
|      10 | 05B29E66  | NULL      |         7 |
+---------+-----------+-----------+-----------+

Итак, у меня есть таблица выше как userinfo. По какой-то причине мне нужно найти повторяющиеся записи для party1_id и party2_id.

Я пробовал ниже:

SELECT
  *
FROM userinfo u1
  JOIN userinfo u2
    ON u1.party1_id = u2.party2_id
WHERE IFNULL(u1.party1_id, 0) > 0
AND IFNULL(u1.party2_id, '') = ''

Fiddle: http://sqlfiddle.com/#! 9 / 725eff / 1

Но это не дало результата так, как я хотел, а просто вернуло 3 записи. Есть ли способ заархивировать мой ожидаемый результат с сортировкой так же, как и в моем ожидаемом выходе.

Ожидаемый результат:

+---------+-----------+-----------+-----------+
| user_id | user_code | party1_id | party2_id |
+---------+-----------+-----------+-----------+
|       1 | 05B29E57  | 1         |           |
|       2 | 05B29E58  | NULL      |         1 |
|       3 | 05B29E59  | 2         |           |
|       4 | 05B29E60  | NULL      |         2 |
|       5 | 05B29E61  | 3         |           |
|       6 | 05B29E62  | NULL      |         3 |
+---------+-----------+-----------+-----------+

Ответы [ 3 ]

1 голос
/ 11 июля 2020

Вы можете попробовать следующее.

select * from userinfo where 
party1_id  in (
  SELECT
  u1.party1_id
FROM userinfo u1
  JOIN userinfo u2
    ON u1.party1_id = u2.party2_id
WHERE IsNULL(u1.party1_id, 0) > 0
AND IsNULL(u1.party2_id, '') = '') or party2_id in ( SELECT
  u1.party1_id
FROM userinfo u1
  JOIN userinfo u2
    ON u1.party1_id = u2.party2_id
WHERE IsNULL(u1.party1_id, 0) > 0
AND IsNULL(u1.party2_id, '') = '')
1 голос
/ 11 июля 2020

Вы можете получить ожидаемый результат, используя union

select t1.* 
from userinfo t1
inner join  (
    select a.party1_id apid, b.party2_id bpid
     FROM userinfo a
      JOIN userinfo b
        ON a.party1_id = b.party2_id
) t2 on t2.apid = t1.party1_id
UNION 
select t1.* 
from userinfo t1
inner join  (
    select a.party1_id apid, b.party2_id bpid
     FROM userinfo a
      JOIN userinfo b
        ON a.party1_id = b.party2_id
) t2 on t2.apid = t1.party2_id
order by user_id 

http://sqlfiddle.com/#! 9 / 725eff / 17

для производительности, убедитесь, что у вас есть хотя бы thiese индексы

idx1  table userinfo columns (party1_id, party2_id)

idx2 table userinfo columns (party2_id, party1_id)
0 голосов
/ 11 июля 2020

Попробуйте выполнить следующий запрос:

SELECT
  *
FROM userinfo u1
  where
  u1.party1_id in (select distinct u2.party2_id from userinfo u2) 
  or 
  u1.party2_id in (select distinct u3.party1_id from userinfo u3)

Ниже приведен результат, который я получаю в вашей скрипке для указанного выше запроса: (порядок можно применить к любому столбцу)

user_id     user_code   party1_id   party2_id
1           05B29E57    1   
2           05B29E58    (null)      1
3           05B29E59    2   
4           05B29E60    (null)      2
5           05B29E61    3   
6           05B29E62    (null)      3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...