MySQL'AND'子句不能正常运行

时间:2015-02-01 16:40:26

标签: mysql sql

我正在尝试创建一个搜索引擎系统。在MySQL语句中,我连接了名字和姓氏,并试图获得与其名字和姓氏中的关键字母匹配的用户。如果他们的account_type = 0account_ban = 0,则还会返回account_Type = 1account_ban = 1的用户。以下是我的询问:

SELECT 
 firstname, lastname
FROM users
WHERE CONCAT(firstname,lastname) LIKE '%jb%'
   OR CONCAT(firstname,lastname) LIKE '%bj%' 
  AND account_type = 0
  AND account_ban = 0;

我这里有两个问题。首先它返回的用户account_type = 1account_ban = 1也是第二个问题,如果我在名称中插入一个空格,例如%j b%%b j%,它不会返回任何内容。请帮忙。

5 个答案:

答案 0 :(得分:2)

目前还不清楚你真正想要的空间,但这里有一个解决方案:

SELECT firstname, lastname
FROM users
WHERE (CONCAT(firstname, lastname) LIKE '%j%b%' OR
       CONCAT(firstname, lastname) LIKE '%b%j%' 
      ) AND
      account_type = 0 AND account_ban = 0;

这将匹配“b”和“j”之间的任何字符,包括没有字符和空格。您可以将一个字符与'_'完全匹配,但这似乎不是您想要的。这应该可以解决问题:

WHERE (REPLACE(CONCAT(firstname, lastname), ' ', '') LIKE '%j%b%' OR
       REPLACE(CONCAT(firstname, lastname), ' ', '') LIKE '%b%j%' 
      ) AND
      account_type = 0 AND account_ban = 0;

答案 1 :(得分:1)

您需要添加parenthesis来过滤正确的记录。

要获得account_type = 1 and account_ban = 1,您需要在where子句中添加该条件。试试这个。

SELECT firstname,
       lastname
FROM   users
WHERE  ( Concat(firstname, lastname) LIKE '%jb%'
          OR Concat(firstname, lastname) LIKE '%bj%' )
       AND ( ( account_type = 0
               AND account_ban = 0 )
              OR ( account_type = 1
                   AND account_ban = 1 ) ) 

答案 2 :(得分:1)

由于AND将在OR之前进行评估(这是一个问题),您必须在OR语句周围加上括号:

SELECT 
 firstname
 , lastname
FROM users
WHERE 
( CONCAT(firstname,lastname) 
LIKE '%jb%'
OR
 CONCAT(firstname,lastname)
LIKE '%bj%' 
)AND
 account_type = 0
AND
 account_ban = 0
;

答案 3 :(得分:1)

我想你忘记了一些括号:

SELECT  firstname, lastname 
FROM users 
 WHERE (CONCAT(firstname,lastname) LIKE '%jb%'
         OR CONCAT(firstname,lastname) LIKE '%bj%') 
        AND account_type = 0 
        AND account_ban = 0;

这应该可以解决你的第一个问题。

答案 4 :(得分:1)

使用正确的括号将解决您的问题。 您的查询应如下所示:

SELECT  firstname, lastname 
FROM users 
 WHERE (CONCAT(firstname,lastname) LIKE '%jb%'
         OR CONCAT(firstname,lastname) LIKE '%bj%') 
        AND account_type = 0 
        AND account_ban = 0;