我先将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
此查询给出了我的数组2,4,6,5,9然后我在以下查询中使用它
SELECT * from user WHERE uid IN (2,4,6,5,9)
最佳做法是什么?
答案 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
结果:
答案 1 :(得分:0)
您的“友谊”状态是针对还是未指示?即如果user1是user2的朋友,暗示user2是user1的朋友?如果是这样,您必须更改ON
和WHERE
条件:
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