我有一个查询,实际上是一个成员匹配首字母'a',结果也包含用户朋友。 我想要的是,用户朋友必须先来到结果中然后留下用户。
这是查询
SELECT `a`.`mem_id`
FROM `members` `a`
INNER JOIN
(
SELECT DISTINCT `n2`.`mem_id`
FROM `network` `n1`,`network` `n2`
WHERE `n1`.`frd_id` = `n2`.`mem_id`
AND `n1`.`mem_id`='777'
AND `n2`.`frd_id`='777'
) `b`
WHERE `a`.`mem_id`=`b`.`mem_id`
AND `a`.`profilenam` LIKE 'a%'
AND `a`.`deleted` ='N'
ORDER BY `profilenam`
答案 0 :(得分:0)
据我了解你的问题,这是一个将返回你正在寻找的数据的查询:
SELECT M.mem_id
FROM members M
LEFT OUTER JOIN (SELECT DISTINCT N1.mem_id
,N1.frd_id
FROM network N1
INNER JOIN network N2 ON N2.mem_id = N1.frd_id
AND N2.frd_id = N1.mem_id) F ON F.mem_id = M.mem_id
AND F.frd_id = '777'
WHERE M.profilename LIKE 'a%'
AND M.deleted = 'N'
ORDER BY CASE
WHEN F.mem_id IS NOT NULL THEN 0
ELSE 1
END, M.profilename
关于我的查询的一些解释:
表members
在查询上有LEFT OUTER JOIN
,返回每个现有的友谊(根据您的查询,我认为要将两个成员视为朋友,必须在表中建立双向连接network
)。
具有条件F.frd_id = '777
的此关节确保仅在活跃成员是身份为'777'
的成员的朋友时才进行加入。
最后一个元素是您正在寻找的关键元素,ORDER BY
子句首先让朋友,然后是其他成员。该子句的第一个条件是一个简单的SWITCH
语句,用于测试是否存在关节,如果是,则表示该成员是朋友,否则不是。每个朋友的值都为0,其他成员的值为1,通过对该值进行升序排序,结果将按需排序。
希望这会有所帮助。