对于任何符合条件的成员加上成员本身,对朋友表进行预查询怎么样,然后返回到其余表...
select STRAIGHT_JOIN
PeopleList.Member_id,
members.last_name,
members.first_name, (etc with any other fields)
ms.status_id,
ms.description (etc with any other fields from member_status table)
from
( Select DISTINCT m.member_id
from Members m
where m.member_id = MemberDesiredVariable
union select f.friend_id AS member_id
from Friends f
where f.member_id = MemberDesiredVariable
union select f2.member_id
from Friends f2
where f2.friend_id = MemberDesiredVariable ) PeopleList
join members
on PeopleList.member_id = members.member_id
join member_status ms
on PeopleList.member_id = ms.member_id
这应该得到有问题的主要人,而不管“朋友”表中有任何记录的人,例如一个还没有条目的新人......他们至少会符合条件并加入成员和 member_status表格。
然后,在成员 1 是条件的场景中,它将向朋友查询任何“Friend_ID”,因此 DISTINCT 将具有 1(直接来自成员)和 member_id = 1 的 2,找到Friend_id = 2。所以现在,这个预查询有两个 ID,然后继续获取您想要的任何其他详细信息。
第三种情况是你想要成员 2...所以,直接查询成员表可以保证他们在列表中的 ID 被处理,但是由于他们的 ID 不是朋友表中的“MEMBER_ID”,它必须从其他人那里寻找自己的“FRIEND_ID”并获取该会员的 ID。所以现在,成员 2 也将找到成员 1 并继续获取详细信息。
对于成员 3,如果您针对 Friends 表进行查询,则根本不会得到任何记录,即使成员 3 有一些状态记录......它必须对自己进行限定才能包含其余的处理中...但在朋友表中不会发现自己是“member_id”或“friend_id”。
我实际上无法在当前位置进行测试,但逻辑上应该没问题。
最后,如果您希望好友名称不考虑任何“状态”更改,请将上次加入 member_status 更改为 LEFT JOIN。
--- 评论反馈
我不能具体推荐任何书籍,它只是来自多年的经验......
1. 了解您的数据之间的关系...
2. 找出内心深处的“我想得到什么”。
3. 排除所有其他元素,直到获得 CRITERIA,而不是 CONTENT。
4. 将您的主要“获取标准”放在前面……然后加入您的其他表格。
5.然后在输出结果集中添加你想要的所有其他字段
试图解决复杂的查询通常会被人们试图获取的所有其他数据元素所困扰。像许多其他编程任务一样......我喜欢让它工作,然后让它变得漂亮。查询也是如此。如果您的基线查询没有得到您想要的结果,那么无论您连接多少其他表(左连接、外连接或普通连接),您的输出都将是错误的。
我还在顶部的 sql 中添加了子句“STRAIGHT_JOIN”。这告诉 MySql 按照我指示的顺序进行查询,并且不要让优化器尝试为我考虑。在将主表(例如数百万条记录)连接到“查找”辅助表时,这一子句出现得如此频繁,以至于查询引擎错误地将查找表解释为查询的主表,从而扼杀了性能......
尝试在可用的版本之间进行一些定时测试。如果它们具有同等的可比性,我通常会选择我能理解的那个,以防我将来不得不修改/更改某些东西。