2017-04-03 54 views
1

我有這樣一個表:如何匹配常見行?

// friends 
+----+---------+--------+ 
| id | user_id | friend | 
+----+---------+--------+ 
| 1 | 1  | Peter | 
| 2 | 1  | Martin | 
| 3 | 2  | Jack | 
| 4 | 1  | Barman | 
| 5 | 3  | Peter | 
| 6 | 1  | Jack | 
| 7 | 3  | David | 
| 8 | 2  | David | 
| 9 | 3  | Martin | 
+----+---------+--------+ 

現在我有兩個user_ids。例如13。現在我想匹配有共同朋友的行。因此,這是預期的結果:

| Peter | 
| Martin | 

因爲PeterMartin對於兩個IDS 13常見。

是否可以通過純sql做到這一點?

回答

1

你可以做friends表的自聯接,具有以下三個條件被要求從兩側匹配記錄聯接:

  1. 的第一個表user_id1
  2. 從第二表中的user_id3
  3. 的朋友匹配(即由雙方共享)


SELECT t1.friend 
FROM friends t1 
INNER JOIN friends t2 
    ON t1.user_id = 1 AND 
     t2.user_id = 3 AND 
     t1.friend = t2.friend 

如果你有指標設置正確,我希望它可以跑得比聚合方法快。

演示在這裏:

Rextester

0

另一種方式

SELECT friend 
FROM t 
GROUP BY friend 
HAVING SUM(user_id =1)>0 
AND SUM(user_id =3)>0 
1

試試這個:

SELECT friend 
FROM friends 
WHERE user_id IN (1, 3) 
GROUP BY friend HAVING COUNT(DISTINCT friend) = 2; 
+1

您應該刪除'DISTINCT'。 http://rextester.com/live/TRLVT55215 – stack

+0

@stack它看起來像[你是對的](http://rextester.com/PZO2412)。 –