[英]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.