2013-05-26 10 views
5

Kullanıcı ve arkadaş masam var. Kullanıcı detaylarına ve kullanıcıya sahip olan kullanıcıların kullanıcı arkadaşları vardır. İşte karşılıklı ile arkadaşının rastgele 5 arkadaş getirmek istiyorum BuradaArkadaş sayısı rastgele arkadaşının yanına git

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

kullanıcı tablonun şema ..

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

ve arkadaşı tablo ..

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

profil resmi olan arkadaş sayısı

Bu sorguyu denedim

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 

Bu sorgu, arkadaşımın ve arkadaşlarımın arkadaşlığını ve karşılıklı sayımını da gösterir. Sorguyla tried. MySQL

+0

sen bakılmaksızın 'karşılıklılık', arkadaşlarınızla ve her bir sayımın arkadaşlar gösteren bir sorgu oluşturmak miyim? – Strawberry

+0

Ben plese çalışıyordum [see] (http://sqlfiddle.com/#!2/b7581/4) – user2302288

cevap

1

RAND() fonksiyonu rastgele kayan nokta değeri döndürür ve ayrıca böyle rasgele sırada satırları alabilirsiniz:

Yani
SELECT * 
    FROM tbl_name 
ORDER BY RAND(); 

yeniden yazma arkadaşınızın her kullanıcının ve bunların sayısını göstermek için sorgu , rastgele seçilmiş:

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; 

Eğer WHERE maddesini kullanmak, sorgu çıkış alacaktı kullanıcı Manish sahu için arkadaşında.

DÜZENLEME:

bunu başarmak için başka bir yol, bir VIEW oluşturmaktır: kullanan ilk sorguyu yeniden yazma, Sonra

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; 

eden yeni VIEW oluşturulan:

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; 

Ardından, rastgele oluşturulmuş bir kullanıcının arkadaşlarının listesini de alabilirsiniz:

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

Ayrıca, GROUP_CONCAT işlevi, bu tür karmaşık sorgular için hata ayıklamada oldukça kullanışlıdır.

diğer bilgiler:

İlgili konular