我正在尝试创建一个搜索引擎系统。在MySQL语句中,我连接了名字和姓氏,并试图获得与其名字和姓氏中的关键字母匹配的用户。如果他们的account_type = 0
和account_ban = 0
,则还会返回account_Type = 1
和account_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 = 1
和account_ban = 1
也是第二个问题,如果我在名称中插入一个空格,例如%j b%
或%b j%
,它不会返回任何内容。请帮忙。
答案 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;