2011-06-28 83 views
1

我有兩個主要列(UID和FID)的朋友表,我基本上是想看看是否例如,如果朋友也是用戶的朋友,所以MySQL:使用union檢查兩列是否包含eachother的值?

uid 5 -> fid 6 
uid 6 -> fid 5 

我曾試圖混合和土豆泥SELECT查詢以某種方式返回一個決定結果,但似乎無法找到任何東西。 count()將返回一個或兩個列(兩個是正確的),但是PHP的PDO沒有好的方法來查找選中(不受影響)的行數而沒有hackish循環。

(SELECT count(uid) FROM friends WHERE uid = 1 AND fid = 2) 
    UNION ALL -- Or plain union 
(SELECT count(uid) FROM friends WHERE uid = 2 AND fid = 1) 

當然,這仍然返回一個或0/1兩行或0或1

你能想到的辦法在MySQL中的第一列返回1或0?或者將此功能寫入我的程序的更好方法? (我儘量避免駭人的事情)

回答

2
SELECT a.uid, a.fid 
FROM friends a 
    JOIN friends b 
    ON a.fid = b.uid 
    AND a.uid = b.fid 
WHERE a.uid = 1 
    AND a.fid = 2 

爲了避免 「重複」 行..如2行,每對夫婦的朋友,加入條件a.uid < b.uid

SELECT a.uid, a.fid 
FROM friends a 
    JOIN friends b 
    ON a.fid = b.uid 
    AND a.uid = b.fid 
    AND a.uid < b.uid 
WHERE a.uid = 1 
    AND a.fid = 2 

因此,計算所有的友誼,用途:

SELECT COUNT(*) AS countAllFrienships 
FROM friends a 
    JOIN friends b 
    ON a.fid = b.uid 
    AND a.uid = b.fid 
    AND a.uid < b.uid 

所以,要計算用戶X的朋友,使用:

SELECT a.uid 
    , COUNT(*) AS numberOfFriends 
FROM friends a 
    JOIN friends b 
    ON a.fid = b.uid 
    AND a.uid = b.fid 
WHERE a.uid = X 
GROUP BY a.uid 
+0

謝謝你們這些例子,我喜歡採摘在他們身上學習。 –

2

爲什麼不是單個查詢?

select count(*) 
from friends 
where ((uid = 1) and (fid = 2)) or ((uid = 2) and (fid = 1)) 

請注意,你必須做一個COUNT(*),作爲UID的將是不同的,如果有一個相互的友誼。你會得到兩排爲1的數,instaed單行的具有2

4

計數你需要一個自動加入返回所有夫婦用戶/朋友這是一個雙射友誼:

SELECT f.uid, f.fid 
FROM Friend f 
    INNER JOIN Friend ff 
     ON f.uid = ff.fid 
     AND f.fid = ff.uid 

要知道,它會返回 '重複',在你的情況:

uid | fid 
5  6 
6  5