2012-10-22 39 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) –