2

我需要创建一个查询,根据用户喜欢的内容以及喜欢的其他人喜欢的内容向用户推荐艺术家。希望你能明白。

无论如何,有问题的表格是成员(自我解释)和艺术家关注(哪些成员跟随谁)。我稍后会将此查询添加到更大的查询中,该查询还将从该 ID 的艺术家表中获取艺术家信息。

到目前为止,这是我所拥有的,我已将其用作2成员的模拟 ID。

SELECT 

M.ID AS M_ID,

F.ID AS F_ID,
F.follows_ID

FROM members M

LEFT JOIN artist_follows F 
ON F.ID = M.ID

WHERE M.ID ='2'

我意识到它根本不是很多,但它是我所能得到的,因此我为什么来到这里。

以下是需要做的事情的细分:

1:从成员表中获取 ID。

2: 通过成员ID从artist_follows中获取follows_ID(用户关注的人)

3:获取会员关注的人的ID。(为了下一点的目的,将此称为“其他成员 IDS”)。

4:从“其他会员IDS”获取其他艺人ID,确保会员已经关注的艺人不被选中。

希望像那样分解它有帮助!

更新! 让我们按照建议的方式获取一些模拟数据。假设该成员2使用 IDS 关注艺术家3。另一个成员 ( 4)3也随之而来20。因此查询的结果应该是20

架构:

艺术家_关注;

CREATE TABLE `artist_follows` (
 `ID` int(11) NOT NULL,
 `follows_ID` int(11) NOT NULL,
  KEY `fav_ID` (`ID`),
  CONSTRAINT `fav_ID` FOREIGN KEY (`ID`) REFERENCES `artists` (`ID`),
  CONSTRAINT `ID` FOREIGN KEY (`ID`) REFERENCES `members` (`ID`)
 ) ENGINE=InnoDB DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci

会员;

CREATE TABLE `members` (
 `ID` int(111) NOT NULL AUTO_INCREMENT,
 `email` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `password` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `FNAME` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `SURNAME` varchar(100) COLLATE latin1_general_ci NOT NULL,
 `timestamp` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
 PRIMARY KEY (`ID`),
 UNIQUE KEY `email` (`email`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1 COLLATE=latin1_general_ci
4

2 回答 2

1
SELECT DISTINCT new.follows_ID
FROM artist_follows fan
INNER JOIN artist_follows other ON other.follows_ID = fan.follows_ID
INNER JOIN artist_follows new ON new.ID = other.ID
WHERE new.follows_ID NOT IN
    (SELECT follows_ID FROM artist_follows WHERE ID = fan.ID )
AND fan.ID = 2;
于 2012-10-22T22:23:24.820 回答
1

SQL小提琴

create table `members` (
    `id` int(111) not null auto_increment,
    primary key (`id`)
);
create table `artist_follows` (
    `id` int(11) not null,
    `follows_id` int(11) not null,
     constraint `id` foreign key (`id`) references `members` (`id`)
);
insert into members (id) values (2), (4);
insert into artist_follows (id, follows_id) values
(2, 3),
(4, 3),
(4, 20);

select distinct f3.follows_id follows
from
    members m
    inner join
    artist_follows f1 on f1.id = m.id
    inner join
    artist_follows f2 on f1.follows_id = f2.follows_id
    inner join
    artist_follows f3 on f2.id = f3.id 
where
    m.id = '2'
    and
    f3.follows_id not in (
        select follows_id
        from artist_follows
        where id = f1.id
    )
于 2012-10-22T23:05:48.230 回答