2015-08-28 73 views
0

在我的MySQL數據庫中,我計劃在閱讀關於此的文章後雙向存儲友誼。如何查詢雙向友誼?

A-> B B-> A

如果友誼存儲只有一個辦法,那將意味着一個友誼還沒有證實或刪除或任何責任。

我現在唯一想知道的是如何查詢?

如果我查詢所有用戶的朋友。我怎樣才能得到確認的友誼?以後我是否會通過查看數組來排除未確認的友誼,或者有沒有可用於此的查詢?

此外,這將如何工作的逆?什麼是隻獲得未經證實的友誼的問題?

編輯

使用Laravel爲這一個,查詢在模型內製作:

$friendsCollection = $this->where('user_a', '=', $currentUserId)->orWhere('user_b', '=', $currentUserId)->get(); 

這會給我所有的行,其中當前用戶或者是USER_A或USER_B在友誼。

現在我的問題是如何消除「破碎」的連接?哪裏只有兩行中的一行存在?

另外它只是發生在我身上的時候,如何在用戶開始擁有許多朋友時對此進行分頁。

+0

純理論doen't這裏工作。代碼在stackoverflow上講話。請發表你曾嘗試過的東西 – Keerthivasan

+2

當你提到'雙向友誼'時,我有一種溫暖的模糊感覺。 –

+0

好像你應該有一個朋友請求表和一個朋友表。單向友誼在您的設置中並不存在,因此它不應該存儲在同一個表中。 – Devon

回答

1

你的表格可以像這樣:

CREATE TABLE users(
    userId int PRIMARY KEY, 
    username VARCHAR(30) NOT NULL 
); 

CREATE TABLE friendship(
    userId int NOT NULL, 
    friendId int NOT NULL, 
    PRIMARY KEY (userId, friendId) 
); 

插入一些值:

insert into users VALUES (1, 'a'); 
insert into users VALUES (2, 'b'); 
insert into users VALUES (3, 'c'); 

insert into friendship VALUES (1,2); 
insert into friendship VALUES (2,1); 
insert into friendship VALUES (1,3); 

所以您的查詢尋找雙向的友誼可以是這樣的:

SELECT u1.username, u2.username 
FROM friendship f1 
LEFT JOIN users u1 
    ON u1.userId = f1.userId 
LEFT JOIN users u2 
    ON u2.userId = f1.friendId 
    WHERE EXISTS (SELECT * FROM friendship f2 WHERE f2.userId = f1.friendId) 

結果:

username username 
------------------ 
    a   b 
    b   a 

而對於單向查詢(未經證實)的友誼可以是這樣的:

SELECT u1.username, u2.username 
FROM friendship f1 
LEFT JOIN users u1 
    ON u1.userId = f1.userId 
LEFT JOIN users u2 
    ON u2.userId = f1.friendId 
    WHERE NOT EXISTS (SELECT * FROM friendship f2 WHERE f2.userId = f1.friendId) 

結果:

username username 
------------------ 
    a   c 
+0

不是太破舊。 – Drew

+0

非常感謝埃斯特班!馬上試試吧! – Badger

+0

最後花了我多一點時間,但你絕對幫助我走向正確的方向@Esteban!非常感謝! :) – Badger