2012-08-02 54 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