2013-05-26 25 views
5

Tôi có một người dùng và một người bạn bảng. Người dùng có chi tiết người dùng và bạn bè có bạn bè của người dùng. Dưới đây là giản đồ của bảng người dùng ..Nhận bạn ngẫu nhiên của bạn bè với số lượng tương đối

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

và bảng friend ..

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

Hồ sơ pic

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

Ở đây tôi muốn lấy ngẫu nhiên 5 người bạn của người bạn với nhau bạn bè số

Tôi đã thử truy vấn này

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 

Truy vấn này hiển thị bạn bè của bạn bè cũng như bạn bè và cả hai bên cũng không chính xác. Truy vấn rằng tôi tried.

+0

Bạn có thể xây dựng một truy vấn cho thấy bạn của bạn bè và đếm tương ứng, không phụ thuộc vào 'lẫn nhau'? – Strawberry

+0

Tôi đã cố gắng plese [xem] (http://sqlfiddle.com/#!2/b7581/4) – user2302288

Trả lời

1

RAND() chức năng trong MySQL trả về một giá trị dấu chấm động ngẫu nhiên và bạn cũng có thể lấy hàng trong thứ tự ngẫu nhiên như thế này:

SELECT * 
    FROM tbl_name 
ORDER BY RAND(); 

Vì vậy, viết lại truy vấn của bạn để hiển thị những người bạn của mỗi người dùng và số lượng của họ , được chọn ngẫu nhiên:

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; 

Nếu bạn sử dụng mệnh đề WHERE, truy vấn sẽ xuất kết quả của người bạn cho người dùng Manish Sahu.

EDIT:

Một cách khác để thực hiện nó là tạo ra một 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; 

Sau đó, viết lại truy vấn đầu tiên sử dụng của chúng tôi mới được tạo 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; 

Sau đó, bạn cũng có thể truy xuất danh sách những người bạn của người dùng được tạo ngẫu nhiên:

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

Ngoài ra, chức năng GROUP_CONCAT khá hữu ích trong việc gỡ lỗi các truy vấn phức tạp như vậy. Thông tin

thêm:

Các vấn đề liên quan