如何调整此查询以获得结果?

时间:2013-02-25 08:23:26

标签: mysql sql

我有一个查询,实际上是一个成员匹配首字母'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`

1 个答案:

答案 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,通过对该值进行升序排序,结果将按需排序。

希望这会有所帮助。