2015-02-24 73 views
0

我有一個mytable類似如下:mysql的不同的或不

id child 
1  
2 1 
3 1 
4 
5 
6 5 
7  
8 

等 我只想選擇所有的孩子和所有的父母。

在這個例子中它建議立即進行刪除是:

id child 
1 
2 1 
3 1 
5 
6 5 

我創建選擇這樣的:

SELECT * FROM mytable的,其中(child <> '')或id IN(SELECT 不同( child)FROM mytable where child <>'');

但也許它可以做得更優雅的方式,特別是在考慮速度。

+0

您的預期輸出是非常不清楚的。你能解釋一下嗎? – 2015-02-24 16:24:39

+0

因此4/7/8應該排除,因爲它們不是任何其他記錄的父母或子女? – 2015-02-24 16:26:24

+0

@Marc乙 - 是的確切 – Felluciano 2015-02-24 16:32:32

回答

0
SELECT mytable.* 
FROM mytable 
JOIN mytable AS t2 
WHERE mytable.id = t2.child 
AND t2.child <> '' 
UNION 
SELECT * 
FROM mytable 
WHERE child <> '' 
GROUP BY id, child 

假設你有一個id和另一個孩子的索引,這將使用雙方的索引。 GROUP BY將會對性能產生影響,但對於防止UNION第一部分的重複記錄是必要的。

0

我會做的是讓這樣的孩子的名單開始:

SELECT DISTINCT child 
FROM myTable 
WHERE child IS NOT NULL; 

這會給你1和5。然後,所有你需要做的是選擇行其中ID是在上面子查詢,OR,其中孩子是在上述子查詢:

SELECT * 
FROM myTable 
WHERE id IN(
    SELECT DISTINCT child 
    FROM myTable 
    WHERE child IS NOT NULL) 
OR child IN(
    SELECT DISTINCT child 
    FROM myTable 
    WHERE child IS NOT NULL) 
AND child IS NOT NULL 
ORDER BY id; 

下面是一個SQL Fiddle例子。