在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秒钟。问题是,这个答案或我的答案中的疑问不应该花这么长时间。尝试查看数据库、服务器设置等。