0

我有 2 个表,第一个被称为friendship第二个被称为user具有以下详细信息

friendship表字段:

uid1, uid2

user表字段:

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

user想法是在表上时从表uid1中获取所有朋友的详细信息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

这个查询给了我 ids 2,4,6,5,9 的数组然后我在下面的查询中使用它

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

最佳做法是什么?

4

3 回答 3

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

结果:

在此处输入图像描述

于 2012-08-02T16:20:18.120 回答
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
于 2012-08-02T16:59:01.900 回答
0

你的“友谊”状态是定向的还是非定向的?即如果user1 是user2 的朋友,是否暗示user2 是user1 的朋友?如果是这样,您必须更改您的ONWHERE条件:

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

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

于 2012-08-02T16:02:54.923 回答