生成使用排除记录进行搜索的查询

时间:2017-10-23 18:38:40

标签: mysql

我在mysql面临问题,以生成website中可以使用的良好查询。我正在做的是,如果用户登录网站并尝试使用first_namelast_nameusername等关键字搜索已注册的用户,那么我想将结果返回给我,排除正在搜索的用户记录。这是具有数据的users表。

+----+-----------------+----------+------------+-----------+
| id | email           | username | first_name | last_name |
+----+-----------------+----------+------------+-----------+
| 1  | jim@example.com | jim      | Jim        | John      |
+----+-----------------+----------+------------+-----------+
| 2  | doe@example.com | doe      | Doe        | John      |
+----+-----------------+----------+------------+-----------+
| 3  | tim@a.com       | tim      | Tim        | John      |
+----+-----------------+----------+------------+-----------+ 

假设有id 1的用户正在搜索,并使用john之类的关键字搜索我用于排除该用户记录的查询

SELECT *
FROM
 `users`
WHERE
    `id` <> 1 AND CONCAT(`first_name`, ' ', `last_name`) LIKE "%john%" OR `username` LIKE "%john%"

然后mysql给出这样的结果。

+----+-----------------+----------+------------+-----------+
| id | email           | username | first_name | last_name |
+----+-----------------+----------+------------+-----------+
| 2  | doe@example.com | doe      | Doe        | John      |
+----+-----------------+----------+------------+-----------+
| 3  | tim@a.com       | tim      | Tim        | John      |
+----+-----------------+----------+------------+-----------+

但是当我使用id 1的用户名进行搜索时,为什么mysql不会排除记录

SELECT *
FROM
 `users`
WHERE
    `id` <> 1 AND CONCAT(`first_name`, ' ', `last_name`) LIKE "%jim%" OR `username` LIKE "%jim%"

输出结果:

+----+-----------------+----------+------------+-----------+
| id | email           | username | first_name | last_name |
+----+-----------------+----------+------------+-----------+
| 1  | jim@example.com | jim      | Jim        | John      |
+----+-----------------+----------+------------+-----------+

1 个答案:

答案 0 :(得分:0)

它只是你和/或中的括号问题:

 `id` <> 1 AND ( CONCAT(`first_name`, ' ', `last_name`) LIKE "%jim%" 
                 OR `username` LIKE "%jim%" )