在我解決它之前,我認為這會很容易。
我正在嘗試撰寫一個查詢,該查詢將生成一個相互關注的用戶串列(如 tiktok)。獲取互相關注的用戶串列并不難,但我的查詢顯示了兩種方式。
例如,資料如下所示:
follower_id followee_id
1 2
1 3
1 4
2 1
2 3
2 4
3 1
3 2
3 4
4 2
4 3
使用上述資料,輸出應為:
follower_id followee_id
1 2
1 3
2 3
2 4
3 4
請注意,除了 4 不跟隨 1 之外,每個人都跟隨所有人。
表結構如下
CREATE TABLE follows (
follower_id INT NOT NULL,
followee_id INT NOT NULL
);
插入陳述句:
INSERT INTO follows(follower_id, followee_id)
VALUES(1,2), (1,3), (1,4), (2,1), (2,3), (2,4), (3,1), (3,2), (3,4), (4,2), (4,3);
我認為自加入可以讓用戶互相關注,但我得到的行數是我想要的兩倍。
mysql> SELECT
-> f1.follower_id AS f1_follower,
-> f1.followee_id AS f1_followee,
-> f2.follower_id AS f2_follower,
-> f2.followee_id AS f2_followee
-> FROM follows f1
-> JOIN follows f2
-> ON f1.follower_id = f2.followee_id
-> AND f1.followee_id = f2.follower_id
-> ORDER BY f1.follower_id, f1.followee_id;
------------- ------------- ------------- -------------
| f1_follower | f1_followee | f2_follower | f2_followee |
------------- ------------- ------------- -------------
| 1 | 2 | 2 | 1 |
| 1 | 3 | 3 | 1 |
| 2 | 1 | 1 | 2 |
| 2 | 3 | 3 | 2 |
| 2 | 4 | 4 | 2 |
| 3 | 1 | 1 | 3 |
| 3 | 2 | 2 | 3 |
| 3 | 4 | 4 | 3 |
| 4 | 2 | 2 | 4 |
| 4 | 3 | 3 | 4 |
------------- ------------- ------------- -------------
10 rows in set (0.00 sec)
在第一行中,我們看到 1 和 2 彼此跟隨,但第三行也顯示 1 和 2 彼此跟隨,只是第一行的倒數。第 2 行和第 6 行、第 4 和第 7 行、第 5 和第 9 行以及第 8 和第 10 行也是如此。所以我真的只想顯示第 1、2、4、5 和 8 行(即,只有非倒數行)。互惠可能不是正確的詞 - 輸出中的假設是 1, 2 表示“用戶 1 和 2 相互關注”。
我可能想太多了,但是任何和所有的幫助都將不勝感激!
uj5u.com熱心網友回復:
您的原始查詢很好,您只需要附加謂詞只回傳一個版本的關系 -
SELECT f1.*
FROM follows f1
JOIN follows f2 ON f1.follower_id = f2.followee_id AND f1.followee_id = f2.follower_id
WHERE f1.follower_id < f1.followee_id;
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/407536.html
標籤:
