2012-08-02 76 views
0

我2臺首先是所謂的friendship秒被稱爲user具有以下細節
最佳實踐JOIN WHERE查詢

friendship表中的字段:

uid1, uid2 

user表中的字段:

uid, username, primary_email, f_name, m_name, l_name, avatar, avatar_path 

想法是從user得到所有朋友的詳細信息表w母雞uid1friendship表中,例如= 1是以下查詢是這個想法的最佳實踐?

SELECT 
    u.uid, 
    u.username, 
    u.primary_email, 
    u.f_name, 
    u.m_name, 
    u.l_name, 
    u.avatar, 
    u.avatar_path 
FROM friendship AS f 
LEFT JOIN user AS u ON f.uid2=u.uid 
WHERE f.uid1=1 

是否使用加入單個查詢或使用2個查詢一個來提取友誼表,第二個從用戶表如提取每個ID的細節IDS最佳實踐: -

SELECT uid2 from friendship WHERE uid1 =1 

該查詢給我的ID陣列2,4,6,5,9然後我在下面的查詢

SELECT * from user WHERE uid IN (2,4,6,5,9) 

什麼是最好的做法使用它呢?

+0

你想知道誰的朋友和朋友的名字用戶的名字嗎?或者只有朋友的名字? – Taryn 2012-08-02 16:00:59

+0

@bluefeet我想提取我的朋友的所有細節 – 2012-08-02 16:02:06

回答

0

您的「友誼」狀態是否定向或不定向?即如果用戶1是用戶2的朋友,意味着用戶2是用戶1的朋友?如果是這樣,你必須改變你的ONWHERE條件:

ON f.uid2 = u.uid OR f.uid1 = u.uid 
WHERE u.uid = 1 

除此之外,我認爲沒有錯的選擇查詢。

+0

找到每一個友誼有兩個1-> 2和2-> 1 – 2012-08-02 16:07:40

+0

@MarcusAdams:在WHERE子句中使用u.uid不需要OR – knittl 2012-08-02 16:44:35

+0

Doh!你是對的。 – 2012-08-02 17:00:49

1

該查詢會給你的主要人員的名字和他們的朋友的名字:

create table users 
(
    uid int, 
    username varchar(10), 
    fname varchar(10) 
) 

insert into users values(1, 'test', 'Jim') 
insert into users values(2, 'blah', 'Tim') 
insert into users values(3, 'xxx', 'Henry') 
insert into users values(4, 'nada', 'Bob') 

create table friendship 
(
    uid1 int, 
    uid2 int 
) 

insert into friendship values (1, 2) 
insert into friendship values (1, 3) 
insert into friendship values (2, 3) 
insert into friendship values (3, 4) 

select u2.uid personid 
    , u2.fname personname 
    , f.uid2 friendid 
    , u1.username friendusername 
    , u1.fname friendname 
from users u1 
inner join friendship f 
    on u1.uid = f.uid2 
left join users u2 
    on f.uid1 = u2.uid 

結果:

enter image description here

+0

+1。例如。 – SiB 2012-08-02 16:38:58

+0

請注意,我使用代碼來提取朋友detal爲一個用戶不要獲得每個用戶的所有朋友 – 2012-08-02 18:41:25

0

如果你確定你要使用的所有的數據,我認爲最好的做法是將結果放在一個查詢中。這隻需要一次訪問數據庫而不是每個朋友一次(加上初始查詢)。

但是,請注意,由於您使用的是來自友誼的LEFT OUTER JOIN,因此如果友誼表中沒有相應的uid用戶記錄,則可以返回NULL行。

嘗試的INNER JOIN,而不是像這樣:

SELECT 
    u.uid, 
    u.username, 
    u.primary_email, 
    u.f_name, 
    u.m_name, 
    u.l_name, 
    u.avatar, 
    u.avatar_path 
FROM friendship AS f 
JOIN `user` AS u 
    ON u.uid = f.uid2 
WHERE f.uid1 = 1 
+0

請注意,第二個查詢提取所需的所有數據,因爲我使用'IN'因此不需要滾動通過每個朋友 – 2012-08-02 18:38:19

+0

@Dr_movi,你是對的。所以,一個查詢與兩個。 :) – 2012-08-02 19:04:38

+0

是與查詢連接vs 2簡單查詢請注意,此查詢將被使用千次 – 2012-08-02 19:14:25