MySQL搜索用户,订购其他朋友

时间:2012-11-12 05:34:03

标签: mysql sql

  • 我有一项功能可以在我的网站上搜索用户
  • 我的网站上也有朋友的功能。
  • 我有一个查询,要在我的网站上搜索正确的用户,
  • 我有一个查询,确定用户是朋友的用户,他们都按照自己的意愿工作,

所以我需要帮助的是将两者结合起来,在其他用户之前订购朋友。

搜索查询:

SELECT userID, fname, lname, 
FROM names 
WHERE (
    fname LIKE '".$term."%' 
    OR lname LIKE '".$term."%' 
    OR CONCAT(fname, ' ', lname) LIKE '".$term."%'
      ) 
AND userID!=$session 
ORDER BY fname ASC, lname ASC 
LIMIT 10

朋友查询:

SELECT CASE WHEN userID=$session 
            THEN userID2 
            ELSE userID 
            END AS friendID 
FROM friends
WHERE (
       userID=$session 
       OR userID2=$session
       ) 
AND state='1'

所以,一个比较两者的陈述应该是IF names.userID=friends.friendID

现在我发现用户建议在stackoverflow上遇到类似的问题,这似乎是一种简单的方法,但是我不完全确定如何使用我的特定朋友查询添加它,因为它更像是一个复杂的查询。

SELECT
    posting.id,
    IF(a.friend_id = b.criteria, 1, 0) AS is_friend
...
ORDER BY is_friend DESC, posting.id DESC

1 个答案:

答案 0 :(得分:2)

使用外部联接(左联接)将第一个查询返回的用户列表与第二个查询生成的好友列表相连接。现在,您将能够对第二行集是否匹配这一事实进行排序:如果匹配,则相应的行应该先行。

这是一个如何实现上述内容的示例:

SELECT
  n.userID,
  n.fname,
  n.lname
FROM names n
LEFT JOIN (
  SELECT CASE WHEN userID=$session 
              THEN userID2 
              ELSE userID 
              END AS friendID 
  FROM friends
  WHERE (
         userID=$session 
         OR userID2=$session
         ) 
  AND state='1'
) f
ON n.userID = f.friendID
WHERE (
    n.fname LIKE '".$term."%' 
    OR n.lname LIKE '".$term."%' 
    OR CONCAT(n.fname, ' ', n.lname) LIKE '".$term."%'
      ) 
AND n.userID!=$session 
ORDER BY (f.friendID IS NULL), n.fname ASC, n.lname ASC 
LIMIT 10

第一个排序标准(f.friendID IS NULL)如果匹配的false行(即用户是朋友),则评估为f,否则评估为true。因此,由于falsetrue之前排序,所以朋友将在非朋友之前排序。