SELECT JOIN WHERE查询的最佳实践

时间:2012-08-02 15:56:14

标签: mysql select join

我先将2个表称为friendship秒,称为user,其中包含以下详细信息

friendship表格字段:

uid1, uid2

user表格字段:

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

想法是在useruid1上的friendship表中获取所有朋友的详细信息,例如= 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,第二个用于从用户表中提取每个id的详细信息,例如: -

SELECT uid2 from friendship WHERE uid1 =1

此查询给出了我的数组2,4,6,5,9然后我在以下查询中使用它

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

最佳做法是什么?

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您的“友谊”状态是针对还是未指示?即如果user1是user2的朋友,暗示user2是user1的朋友?如果是这样,您必须更改ONWHERE条件:

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

除此之外,我认为该选择查询没有任何问题。

答案 2 :(得分: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