2017-07-28 91 views
0

我有一個很難推理問題選擇不同的元組在MySQL

 
+------+------------+ 
| id | sibling_id | 
+------+------------+ 
| 1 |  NULL | 
| 2 |   3 | 
| 3 |   2 | 
| 4 |   5 | 
| 5 |   4 | 
+------+------------+ 

如果我選擇ids(1,2,3,5),我想只得到(1,2,4),因爲3 points to 22 points to 3,所以我只想要其中之一。

預期輸出:

 
+------+------------+ 
| id | sibling_id | 
+------+------------+ 
| 1 |  NULL | 
| 2 |   3 | 
| 4 |   5 | 
+------+------------+ 

我怎麼能這樣做與MySQL(5.7)?

解決方案

select distinct least(id, coalesce(sibling, id)) from test where id in (1,2,3,5);

謝謝大家!

+2

不應該得到(1,2,4)? –

+0

爲什麼'5',因爲指向'4'?你不應該收到'1,2,4'嗎? – BenM

+0

不,因爲4不在我選擇的ID列表中(它是1,2,3,5) – Shivoham

回答

3

你必須確保,即元組始終是相同的(意爲如始終是(2,3),而不是(3,2))。您可以通過始終將較小的值放在前面,並將更大的值放在元組末尾來實現。使用LEAST()GREATEST()

SELECT 
DISTINCT 
LEAST(id, sibling_id), GREATEST(id, sibling_id) 
FROM table 
WHERE id IN (1,2,3,5); 
+0

我結束了這個查詢: 'select distinct(id,coalesce(sibling,id))from test where in(1,2,3,5);' – Shivoham

-2

你可以使用這個

SELECT DISTINCT LEAST(id, sibling_id), GREATEST(id, sibling_id) FROM table 
WHERE sibling_id NOT IN(SELECT GROUP_CONCAT(id) FROM table) 
+0

會不會跳過2,3,4,5? –