【问题标题】:MySQL Search Friends QueryMySQL 搜索好友查询
【发布时间】:2018-07-16 09:24:14
【问题描述】:

我有一个用户表:

user_id | firstname | last name | picUrl ...
    1        bob       smith       null  
    2        bobby     smith       null  
    3        rob       smithies    null  

我还有一个朋友表:

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}'

因为您无法将自己添加为好友。

如何忽略/不显示已经是朋友的用户?

示例

我是用户 1。

我搜索“Smith”。

=> 我是用户 1,所以我不是 显示出来。

=> 用户 2 已经是我的朋友,因此不会显示。

=> 仅显示 Rob Smithies

【问题讨论】:

  • 你在这里要求什么?您想要一些用户尚未成为朋友的用户列表吗?
  • 我想要一个符合搜索条件但还不是朋友的用户列表。
  • 您的好友表有些不清楚。例如,好友请求是由“friend1”还是“friend2”发送的,谁接受了?我不会称这些为“friend1”和“friend2”,而是“sender_id”和“receiver_id”,或者类似的东西。

标签: php mysql join search mysqli


【解决方案1】:

只需添加一个匹配朋友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";

【讨论】:

  • 我收到一个 SQL 错误:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,在第 11 行的 '' 附近找到正确的语法?是右括号丢失还是什么?
  • 它运行但显示所有人,即我和已经加为好友的人。
  • 是的,这是可行的,我自己通过一些实验发现了这一点,因为我知道代码并不遥远。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-05
  • 1970-01-01
  • 1970-01-01
  • 2012-07-30
  • 1970-01-01
  • 2015-06-02
  • 1970-01-01
相关资源
最近更新 更多