簡體   English   中英

查詢以獲取與用戶X共享Y => 3的所有用戶Y的關注主題

[英]Query to get subjects of interest for all User Y where Y shares >=3 interests with a User X

這是假設的Twitter之類的數據庫中的兩個表,用戶可以在其中關注其他用戶。 User.name字段是唯一的。

mysql> select uID, name from User;
+-----+-------------------+
| uID | name              |
+-----+-------------------+
|   1 | Alice             |
|   2 | Bob               |
|   5 | Iron Maiden       |
|   4 | Judas Priest      |
|   6 | Lesser Known Band |
|   3 | Metallica         |
+-----+-------------------+
6 rows in set (0.00 sec)

mysql> select * from Follower;
+-----------+------------+
| subjectID | observerID |
+-----------+------------+
|         3 |          1 |
|         4 |          1 |
|         5 |          1 |
|         6 |          1 |
|         3 |          2 |
|         4 |          2 |
|         5 |          2 |
+-----------+------------+
7 rows in set (0.00 sec)

mysql> call newFollowSuggestionsForName('Bob');
+-------------------+
| name              |
+-------------------+
| Lesser Known Band |
+-------------------+
1 row in set (0.00 sec)

我想進行一項操作,為用戶X建議一個他們可能感興趣的用戶列表。 我認為一種試探法可能是針對用戶y遵循的所有y顯示X,而X和y遵循至少3個相同用戶。 下面是我想出的SQL。 我的問題是,它是否可以通過其他一些方式更有效或更好地完成。

DELIMITER //
CREATE PROCEDURE newFollowSuggestionsForName(IN in_name CHAR(60))
BEGIN

DECLARE xuid INT;
SET xuid = (select uID from User where name=in_name);  

select name
from User, (select subjectID
            from follower
            where observerID in (
                select observerID
                from Follower
                where observerID<>xuid and subjectID in (select subjectID from Follower where observerID=xuid)
                group by observerID
                having count(*)>=3
            )
    ) as T
where uID = T.subjectID and not exists (select * from Follower where subjectID=T.subjectID and observerID=xuid);

END //
DELIMITER ;

考慮以下用於存儲過程的重構SQL代碼(未經數據測試)。

select u.`name`
from `User` u
inner join 
   (select subf.observerID, subf.subjectID
    from follower subf
    where subf.observerID <> xuid
   ) f
on u.UID = f.subjectID 
inner join 
   (select f1.observerID
    from follower f1
    inner join follower f2
      on f1.subjectID = f2.subjectID 
     and f1.observerID <> xuid
     and f2.observerID = xuid
    group by f1.observerID
    having count(*) >= 3
   ) o
on f.observerID = o.observerID 

我認為基本查詢開始於獲取與給定觀察者共享三個“主題”的所有“觀察者”:

select f.observerid
from followers f join
     followers f2
     on f.subjectid = f2.subjectid and
        f2.observerid = 2
group by f.observerid
having count(*) = 3;

查詢的其余部分只是在名字加入到適合您的使用名字引用,而不是ID的范例。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM