2013-09-25 41 views
1

我正在開發一個小型社交網絡服務。

很經典,我有3個表:
- 表「circles_users」:屬於同一個 「圈子」
所有用戶 - 表「朋友」:用戶
之間的友好關係 - 表「簽入」:是用戶「簽到」某個地方或不

加入子查詢中的mySQL引用關聯

這裏的數據庫結構:http://sqlfiddle.com/#!2/27888/1

我想問一下我的數據庫給我:
從一個特定的「圈子」與所有用戶爲他們每個人:
- 該用戶已經在共同與用戶ID的朋友的數量= 3
- 如果此用戶是籤還是不

在這裏我想要做的事:

SELECT a.uid, 
(
    SELECT COUNT(*) 
    FROM (SELECT IF (uid1 = 3, uid2, uid1) AS cf FROM friends WHERE (friends.uid1 = 3 OR friends.uid2 = 3)) as b 
    JOIN friends ON ((friends.uid1 = b.cf AND friends.uid2 = a.uid) OR (friends.uid1 = a.uid AND friends.uid2 = b.cf)) 
) as common_friends, 
checkin.status as checkin_status 
FROM 
(SELECT circles_users.uid FROM circles_users WHERE circles_users.circlename = 'circle_A') as a 
LEFT JOIN checkin ON checkin.uid = a.uid 



我得到這個錯誤信息:「對條款」
它已經2現在日子,我想失敗修復此未知列「a.uid」。

看來,我不可能在我的子查詢中引用相關名稱。
例如,如果我用一個特定的uid替換子查詢中的a.uid(例如讓我們說'4'),我不會收到任何錯誤。但當然,結果是錯誤的...

有沒有人可以幫助我? 那將是非常好的:)


其他選擇跟進?

另一種選擇是將「common_friends」子查詢作爲連接。
我試圖做這樣的事情:

SELECT a.uid, 
c.cnt as common_friends, 
checkin.status as checkin_status 
FROM 
(SELECT circles_users.uid as uid FROM circles_users WHERE circles_users.circlename = 'circle_A') as a 
LEFT JOIN 
    (
     SELECT DISTINCT COUNT(*) as cnt 
     FROM (SELECT IF (uid1 = 3, uid2, uid1) AS cf FROM friends WHERE (friends.uid1 = 3 OR friends.uid2 = 3)) as b 
     JOIN friends ON ((friends.uid1 = b.cf AND friends.uid2 = a.uid) OR (friends.uid1 = a.uid AND friends.uid2 = b.cf)) 
    ) as c ON 1=1 
LEFT JOIN checkin ON checkin.uid = a.uid 



但同樣:我收到此錯誤信息:未知列「a.uid」在「關於條款」
無論如何,你認爲這個版本會更容易處理,並會開創新的可能性來解決我的問題?


如果你想與我的查詢玩:(感謝@zundarz)

http://sqlfiddle.com/#!2/27888/1


+0

您是否嘗試過不使用別名的,只是在做circles_users.uid? – Sewder

+0

@Sewder:是的。我得到同樣的錯誤:'on子句'中的未知列'group_users.uid' – SebT

+0

或者,也可以將circles_user.uid的別名指定爲'circles_user.uid作爲uid'的子集 – zundarz

回答

1

重寫了基於你給出的信息查詢和你在找什麼。

SELECT cu.uid, COUNT(f.uid1) common_friends, c.status 
FROM circles_users cu 
LEFT JOIN friends f 
    ON (f.uid1 = cu.uid OR f.uid2 = cu.uid) 
    AND f.status = "on" 
    AND IF (f.uid1 = cu.uid, f.uid2, f.uid1) IN (
     SELECT IF (uid1 = 3, uid2, uid1) 
     FROM friends 
     WHERE status = "on" 
     AND (friends.uid1 = 3 OR friends.uid2 = 3) 
    ) 
LEFT JOIN checkin c 
    ON c.uid = cu.uid AND c.status = "on" 
WHERE cu.circlename = "circle_A" 
GROUP BY cu.uid 

sqlFiddle

+0

Thanks @ funkwurm。我試圖讓它工作,但現在沒有成功...... – SebT

+0

你在得到什麼?錯誤?錯誤的結果?你的桌子結構是什麼? – funkwurm

+0

COUNT(f。*)似乎會引發錯誤。如果我將它隱藏起來,查詢就會執行,但速度很慢(超過10秒) – SebT