繁体   English   中英

在 mysql 中查找多个字段的相同记录

[英]find same record for multiple fields in mysql

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, '') = ''

小提琴: http://sqlfiddle.com/#!9/725eff/1

但它并没有以我想要的方式给出结果,它只返回 3 条记录。 有没有办法归档我预期的 output,排序与我预期的 output 相同。

预期 Output:

+---------+-----------+-----------+-----------+
| 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 |
+---------+-----------+-----------+-----------+

您可以使用 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

为了性能,请确保您至少有这些索引

idx1  table userinfo columns (party1_id, party2_id)

idx2 table userinfo columns (party2_id, party1_id)

您可以尝试以下。

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, '') = '')

尝试以下查询:

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)

下面是 output 我在你的小提琴上面查询:(order by 可以应用于任何列)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM