我正在開發一個小型社交網絡服務。
很經典,我有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
您是否嘗試過不使用別名的,只是在做circles_users.uid? – Sewder
@Sewder:是的。我得到同樣的錯誤:'on子句'中的未知列'group_users.uid' – SebT
或者,也可以將circles_user.uid的別名指定爲'circles_user.uid作爲uid'的子集 – zundarz