2012-04-02 64 views
2

我有以下表格:SQL語句選擇訂單的ID首先與條件

team_members

userid 
teamid 

用戶

uid 
name_f 
name_l 

朋友

friend_id 
friend_one 
friend_two 

我用下面的語句來選擇用戶的UID和profile_pic是屬於某個團隊

SELECT DISTINCT u.uid, u.profile_pic 
FROM friends f, users u, team_members m 
WHERE m.teamid =$team_var 
AND u.uid = m.userid 

我也有運行以下選擇誰都是朋友與登錄用戶和屬於某支球隊用戶的uid和profile_pic。

SELECT DISTINCT u.uid, u.profile_pic 
FROM friends f, users u, team_members m 
WHERE m.teamid =$team_var 
AND u.uid = m.userid 
AND m.userid = f.friend_two 
AND f.friend_one =$session_id 

我正在尋找一種方式來加入,這兩個不是運行2個查詢,運行可以訂購,並列出誰是朋友與用戶一個單一查詢已登錄的用戶在頂部。所以我們可以說某一個團隊有30個用戶,並且這些用戶的5個朋友與登錄用戶,我想有while循環列出的第一個5分的是那些的朋友,其餘的聲明隨機顯示的25。

謝謝你的時間。

+0

在你的朋友映射表中,你是否有像friend_one和friend_two的邏輯重複,例如{{x,y},{y,x}}? – 2012-04-02 19:13:06

+0

是的,我做蒂姆。記錄朋友連接如下(5和10是用戶ID): friend_one:5 friend_two:10 - friend_one:10 friend_two:5 – user1011713 2012-04-02 19:17:29

+0

如果有人有任何建議,請讓我知道...我'米非常堅持這一點。 – user1011713 2012-04-02 20:54:06

回答

1

這可以很容易地與外部解決加盟。沒有顯式連接語法,您可能無法使用外部連接。在這裏:

SELECT 
    u.uid, 
    u.profile_pic, 
    (friend_id IS NOT NULL) AS is_friend 
FROM team_members m 
    INNER JOIN users u ON m.userid = u.uid 
    LEFT JOIN friends f ON m.userid = f.friend_two AND f.friend_one = $session_id 
WHERE m.teamid = $team_var 
ORDER BY 
    is_friend DESC, 
    m.userid 

前兩個表使用的是內部聯接加盟,所以只有特定團隊的成員將返回(因爲我們正在篩選上teamid)。

friends表是外連到先前加入的結果。更具體地說,我們的接合的friends子集其中friend_one是當前用戶。所有從以前的結果集返回行,但在返回也從friends的子行,其中匹配。在不匹配的情況下,friends列填充了NULL s。

使用NULL(或者更確切地說NOT NULL)測試,我們可以看到哪個團隊成員是朋友,哪個不是。測試結果作爲列返回,也用作輸出行的排序標準。

+0

哇。那樣做了。非常感謝! – user1011713 2012-04-02 21:20:58

+0

'inner join'和'join'之間的區別是什麼?'outer join'是什麼意思?我認爲我們在mysql中只有'left join'或'right join',而不是'outer join'。 – TMS 2012-04-02 21:53:45

+0

@Tomas:'INNER JOIN'和'JOIN'意思相同,'INNER'關鍵字是可選的。 [在MySQL中]的外連接(http://dev.mysql.com/doc/refman/5.6/en/join.html「JOIN Syntax(MySQL)」)是'LEFT JOIN'和'RIGHT JOIN'中的一種。它們的完整名稱是'LEFT OUTER JOIN'和'RIGHT OUTER JOIN',所以,正如你所看到的那樣,'OUTER'也是可選的,但即使沒有'OUTER'字也仍然是外連接。 – 2012-04-03 04:54:58

0

您將需要創建具有「朋友」或沒有「朋友」的值,另一列。然後,您將使用該列作爲ORDER BY。您創建的列可能是子查詢,以確定其他用戶是否是朋友。下面的代碼是錯誤的,因爲你需要從外部查詢到勾子查詢的數據,但它應該是這個樣子:

SELECT DISTINCT u.uid, u.profile_pic, 
EXISTS (SELECT DISTINCT u.uid, u.profile_pic 
FROM friends f, users u, team_members m 
WHERE m.teamid =$team_var 
AND u.uid = m.userid 
AND m.userid = f.friend_two 
AND f.friend_one =$session_id 
) AS myColumn 
FROM friends f, users u, team_members m 
WHERE m.teamid =$team_var 
AND u.uid = m.userid 
ORDER BY myColumn 
+0

對於朋友的價值觀,我有朋友表。然後用userrid和friend_two記錄friend_one與第二個用戶的用戶ID,這樣它就成了多餘的,似乎爲朋友的價值創建了另一列。 – user1011713 2012-04-02 19:06:08

0

我可能會建議這樣的:

select u.uid, u.profile_pic 
from team_members t 
    join team_members m on t.teamid = m.teamid 
    join users u on m.userid = u.uid 
    left join friends f on t.userid = f.friend_one and m.userid = f.friend_two 
where m.userid != t.userid 
    and t.userid = $session_id -- This line can be removed to view all (test) 
order by 
    --t.teamid, t.userid, -- This line can be added to order all (test) 
    (case when f.friend_id is null then 1 else 0 end case), 
    f.friend_id, m.userid 

我使用顯式連接語法(現在通常推薦使用這種語法),並按順序使用該case語句將朋友引向頂部。我沒有在這裏運行MySQL來測試它,但語法應該很標準(我在SQL Server上運行的東西非常類似)。

+0

我明白了。在這種情況下,我會在哪裏玩team_variable? – user1011713 2012-04-02 21:02:13

+0

應該是沒有必要的,除非有人可以在一個以上的團隊中工作。 – 2012-04-02 21:04:06

+0

這就是它現在的設置。例如,用戶比爾可以看10支球隊,每支球隊與他的朋友有不同的成員。 – user1011713 2012-04-02 21:06:15