2013-05-26 168 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在调试这样复杂的查询中非常有用。

更多信息: