2012-10-22 40 views
2

我需要创建一个查询,向用户建议艺术家取决于他们喜欢什么以及其他喜欢他们喜欢什么的人。希望你明白。mysql - 创建一个“建议艺术家关注”查询

无论如何,有问题的表是成员(自我解释)和artist_follows(哪些成员跟随谁)。稍后我会将此查询添加到更大的查询中,该查询还将从艺术家表中获取该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:获取follows_ID(用户遵循谁)从artist_follows使用会员ID

3:获取的谁遵循以下成员的人谁IDS。 (为了下一点的目的,称这个“其他成员IDS”)。

4:从“其他成员IDS”获取其他艺术家IDS,确保未选中该成员已经关注的艺术家。

希望把它打破,就像帮助!

更新! 让我们有一些模拟数据,然后建议。可以说会员2跟随艺术家与IDS 3。另一个成员(4)跟在3以及20之后。因此,查询的结果应该是20

模式:

artist_follows;

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 
+0

能否请您发布两个表的结构和一些样本数据,什么是理想的结果,从这个样本数据? –

+0

F.ID是会员的ID和F.follows_ID是艺术家的ID吗? –

+0

@DavidGrenier是的正确 –

回答

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; 
1

SQL Fiddle

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 
    ) 
+0

如果'member'和'other'遵循相同的两位艺术家,会返回什么? –

+0

@TerjeD。空集。没有。 –

+0

检查SQLFiddle [http://sqlfiddle.com/#!2/d58f9/1/0](http://sqlfiddle.com/#!2/d58f9/1/0) –