我有一个用户表:
user_id | firstname | last name | picUrl ...
1 bob smith null
2 bobby smith null
3 rob smithies null
我还有一张 friend 表:
friend1_id | friend2_id | status | date_established
1 2 accepted 2018-02-06 10:23:01
2 1 accepted 2018-02-06 10:23:01
我有一个简单的查询来根据条件($searchString)搜索用户并根据“最佳”匹配对他们进行排序:
$query = "SELECT user_id, firstname, lastname, picUrl, LOWER(CONCAT(firstname, ' ', lastname)) as fullname
FROM user
WHERE LOWER(CONCAT(firstname, ' ', lastname)) LIKE LOWER('%" . $searchString . "%') AND user_id != '{$userId}'
ORDER BY
CASE WHEN fullname = LOWER('" . $searchString . "') THEN 0
WHEN fullname = LOWER('" . $searchString . "%') THEN 1
WHEN fullname = LOWER('%" . $searchString . "%') THEN 2
WHEN fullname = LOWER('%" . $searchString . "') THEN 3
ELSE 4
END, fullname DESC
LIMIT 5";
查询将忽略当前用户:
user_id != '{$userId}'
因为你不能加自己为好友。
如何忽略/不显示已经是 friend 的用户?
示例
我是用户 1。
我搜索“Smith”。
=> 我是用户 1,所以我不是 显示。
=> 用户 2 已经是我的 friend ,所以他们没有显示。
=> 仅显示 Rob Smithies。
最佳答案
再添加一个匹配好友id的条件即可。如下更改您的查询
$query = "SELECT user_id, firstname, lastname, picUrl, LOWER(CONCAT(firstname, ' ', lastname)) as fullname
FROM user
WHERE LOWER(CONCAT(firstname, ' ', lastname)) LIKE LOWER('%" . $searchString . "%') AND (user_id != '{$userId}' AND user_id not in (SELECT friend1_id from friends where friend2_id = '{$userId}') AND user_id not in (SELECT friend2_id from friends where friend1_id = '{$userId}'))
ORDER BY
CASE WHEN fullname = LOWER('" . $searchString . "') THEN 0
WHEN fullname = LOWER('" . $searchString . "%') THEN 1
WHEN fullname = LOWER('%" . $searchString . "%') THEN 2
WHEN fullname = LOWER('%" . $searchString . "') THEN 3
ELSE 4
END, fullname DESC
LIMIT 5";
关于php - MySQL 搜索好友查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48640911/