所以我需要帮助的是将两者结合起来,在其他用户之前订购朋友。
搜索查询:
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
答案 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
。因此,由于false
在true
之前排序,所以朋友将在非朋友之前排序。