2013-05-26 182 views
5

我有一個用戶和一個朋友表。具有用戶詳細信息和朋友的用戶具有用戶的朋友。這裏是交友朋友的隨機朋友

create table profile_pic(pic_id varchar(200),profile_pic_path varchar(1000),small_pic_path varchar(1000), 
adddate varchar(100),userid varchar(60),foreign key(userid) references smsusers(id) ON DELETE CASCADE ON UPDATE CASCADE, 
primary key(pic_id)); 

在這裏,我想獲取隨機5的朋友的朋友,相互用戶表的模式..

create table smsusers(
    id varchar(60), 
    password varchar(50) not null, 
    fname varchar(30) not null, 
    lname varchar(30), 
    mailid varchar(50) not null, 
    gender varchar(10) not null, 
    primary key(id) 
); 

和朋友表..

create table friends_list(
    friend_of varchar(60) NOT NULL, 
    friends_id varchar(60) NOT NULL, 
    friendship_status varchar(30), 
    friendship_date timestamp NOT NULL, 
    primary key(friend_of,friends_id), 
    foreign key(friend_of) references smsusers(id) 
    ON DELETE CASCADE ON UPDATE CASCADE); 

資料相片朋友數

我試過這個查詢

SELECT DISTINCT ff.friends_id, 
    concat(u.fname,' ',u.lname), 
    pp.small_pic_path, 
    count(*) AS mutual_friend_count 
    FROM 
    friends_list f 
    JOIN friends_list ff 
    ON ff.friend_of =f.friends_id 
    LEFT JOIN smsusers u 
    ON 
    u.id=ff.friends_id 
    LEFT JOIN profile_pic pp 
    ON 
    ff.friends_id=pp.userid 
    WHERE f.friend_of = 1 
    AND ff.friends_id NOT IN (1) 
GROUP BY friends_id 

此查詢顯示朋友的朋友,也是我的朋友,並且互相計數也是不正確的。 查詢我tried。在MySQL

+0

你可以構造一個查詢,顯示的朋友和相應的計數的朋友,不管 '互利' 的? – Strawberry

+0

我正在嘗試[see](http://sqlfiddle.com/#!2/b7581/4) – user2302288

回答

1

RAND()函數返回一個隨機浮點值,你也可以檢索像這樣以隨機順序排:

SELECT * 
    FROM tbl_name 
ORDER BY RAND(); 

所以重新寫你的查詢,以顯示每個用戶的朋友和他們的計數,隨機選擇:

SELECT DISTINCT u.id, 
      CONCAT(u.fname,' ',u.lname) AS 'User', 
      GROUP_CONCAT(CONCAT(f.fname,' ',f.lname) SEPARATOR ', ') AS 'Friends', 
      COUNT(*) AS mutual_friend_count 
    FROM smsusers u 
    JOIN friends_list ff 
     ON u.id = ff.friends_id 
    JOIN smsusers f 
     ON ff.friend_of = f.id 
    --WHERE u.id = 1 
GROUP BY friends_id 
ORDER BY RAND() 
    LIMIT 5; 

如果使用WHERE子句,查詢將輸出的朋友的用戶馬尼什薩胡。

編輯:

另一種方式來完成它是創建一個VIEW

CREATE VIEW facebook AS 
    SELECT u.id, 
      CONCAT(u.fname,' ',u.lname) AS 'User', 
      ff.friend_of 
    FROM smsusers u 
    JOIN friends_list ff 
     ON u.id = ff.friends_id 
    JOIN smsusers f 
     ON ff.friend_of = f.id; 

然後,重新編寫使用第一查詢我們的新生成的VIEW

SELECT f.*, 
      GROUP_CONCAT(friend_of SEPARATOR ', ') AS 'FriendsIDs', 
      COUNT(*) AS mutual_friend_count 
    FROM facebook f 
GROUP BY id 
ORDER BY RAND() 
    LIMIT 5; 

然後,您還可以檢索隨機生成的用戶朋友列表:

SELECT f.*, 
      (SELECT `User` 
      FROM `facebook` 
      WHERE `friend_of` IN (1) 
     ORDER BY RAND() 
      LIMIT 1) AS 'RandomFriends' 
    FROM facebook f 
    WHERE id = 1; 

此外,函數GROUP_CONCAT在調試這樣複雜的查詢中非常有用。

更多信息: