Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql SELECT JOIN WHERE查询的最佳实践_Mysql_Select_Join - Fatal编程技术网

Mysql SELECT JOIN WHERE查询的最佳实践

Mysql SELECT JOIN WHERE查询的最佳实践,mysql,select,join,Mysql,Select,Join,我有两个表,第一个叫做友谊第二个叫做用户,有以下详细信息 友谊表格字段: uid1, uid2 uid, username, primary_email, f_name, m_name, l_name, avatar, avatar_path 用户表格字段: uid1, uid2 uid, username, primary_email, f_name, m_name, l_name, avatar, avatar_path 想法是当uid1在Friendly表上时,从user表中获取所

我有两个表,第一个叫做
友谊
第二个叫做
用户
,有以下详细信息

友谊
表格字段:

uid1, uid2
uid, username, primary_email, f_name, m_name, l_name, avatar, avatar_path
用户
表格字段:

uid1, uid2
uid, username, primary_email, f_name, m_name, l_name, avatar, avatar_path
想法是当
uid1
Friendly
表上时,从
user
表中获取所有好友的详细信息,例如=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
最佳做法是使用join进行单个查询,还是使用两个查询—一个用于从友谊表提取id,另一个用于从用户表提取每个id的详细信息—例如:-

SELECT uid2 from friendship WHERE uid1 =1
这个查询给我一个ID为2,4,6,5,9的数组,然后我在下面的查询中使用它

SELECT * from user WHERE uid IN (2,4,6,5,9)
最佳做法是什么?

你的“友谊”状态是直接的还是无方向的?i、 e.如果user1是user2的朋友,这意味着user2是user1的朋友?如果是这样,您必须在和中更改您的
,其中
条件:

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

除此之外,我认为select查询没有任何错误。

此查询将为您提供主要人员的姓名及其朋友的姓名:

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
结果:


如果您确定要使用所有数据,我认为最好的做法是在单个查询中提取结果。这将只需要一次数据库访问,而不是每个朋友一次(加上初始查询)

但是,请注意,由于您使用的是Friendly的左外部联接,如果Friendly表中没有uid的相应用户记录,则可能会返回空行

请尝试像这样的内部联接:

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

您想知道拥有好友和好友姓名的用户的姓名吗?还是只有朋友的名字?@bluefeet我想提取我朋友的所有细节发现每个朋友都有两行1->2和2->1@MarcusAdams:在WHERE子句中使用u.uid不需要或注意第二个查询提取所有需要的数据,因为我在中使用了
,所以不需要滚动每个friendyes on query with join vs 2 simple querys注意此查询将用于上千个查询times@Dr_movi,连接的工作不比两个简单的查询多。在内部,所有同样的工作正在进行。您是否暗示查询缓存可以弥补开销?如果是这样,我必须说我从未在查询缓存上下注。请注意,我使用代码为一个用户提取好友详细信息,而不是获取每个用户的所有好友