2
  • 我有一个功能可以在我的网站上搜索用户,
  • 我的网站上还为朋友提供了功能。
  • 我有一个查询要在我的网站上搜索正确的用户,并且
  • 我有一个查询可以确定用户是朋友的用户,他们都可以正常工作,

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

搜索查询:

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
4

1 回答 1

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否则评估。因此,由于falsesort before true,朋友将排在非朋友之前。

于 2012-11-12T06:11:52.513 回答