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

在mysql中查找多个字段的相同记录,mysql,Mysql,因此,我将上表命名为userinfo。由于某种原因,我必须找到party1_id和party2_id的重复记录 我试过以下方法: +---------+-----------+-----------+-----------+ | user_id | user_code | party1_id | party2_id | +---------+-----------+-----------+-----------+ | 1 | 05B29E57 | 1 |

因此,我将上表命名为
userinfo
。由于某种原因,我必须找到party1_id和party2_id的重复记录

我试过以下方法:

+---------+-----------+-----------+-----------+
| 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 |
+---------+-----------+-----------+-----------+
小提琴:

但它并没有以我想要的方式给出结果,它只返回3条记录。是否有一种方法可以将我的预期输出归档,并与预期输出中的排序相同

预期产出:

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

使用union可以获得预期的结果

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

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

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 

使用union可以获得预期的结果

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

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

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 
尝试以下查询:

idx1  table userinfo columns (party1_id, party2_id)

idx2 table userinfo columns (party2_id, party1_id)
下面是我在上面的查询中得到的结果:(orderby可以应用于任何列)

尝试以下查询:

idx1  table userinfo columns (party1_id, party2_id)

idx2 table userinfo columns (party2_id, party1_id)
下面是我在上面的查询中得到的结果:(orderby可以应用于任何列)


你可以试试下面的内容

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

你可以试试下面的内容

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

在预期输出中,您有6条记录。。解释更好。。是的,这是我的预期输出,但我执行的查询只返回3条记录。@scaisEdge我正在尝试获得与预期输出(即6条记录)类似的结果,但我的实际输出只有3条记录。在预期输出中,您有6条记录。。解释更好。。是的,这是我的预期输出,但我执行的查询只返回3条记录。@scaisEdge我试图获得与预期输出(即6条记录)相似的结果,但我的实际输出只有3条记录。@DS9我在一个有50万条记录的共享托管mysql表和varchar非索引列上运行了类似的查询,只花了3秒钟。问题是,这个答案或我的答案中的疑问不应该花这么长时间。尝试查看数据库、服务器设置等@DS9我在一个共享托管mysql表中运行了一个类似的查询,该表包含50万条记录,在varchar非索引列上运行,只需3秒钟。问题是,这个答案或我的答案中的疑问不应该花这么长时间。尝试查看数据库、服务器设置等。