2

我有一个查询,它实际上是与首字母“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`
4

1 回答 1

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

关于我的查询的一些解释:

该表membersLEFT OUTER JOIN一个查询,该查询返回每个现有的友谊(根据您的查询,我认为要将两个成员视为朋友,必须在表中建立双向连接network)。

这种与条件的结合F.frd_id = '777确保仅当活动成员是具有 id 的成员的朋友时才进行加入'777'

最后一个元素是您要查找的关键元素,即ORDER BY先拥有朋友,然后再拥有其他成员的子句。该子句的第一个条件是一个简单的SWITCH语句,用于测试关节是否存在,如果存在则表示该成员是朋友,否则不存在。每个朋友的值为 0,其他成员的值为 1,通过对该值进行升序排序,结果将按需要排序。

希望这会有所帮助。

于 2014-09-04T22:35:14.573 回答