在我尝试在查询中搜索以下查询时,我可能正在编写错误的语法,但我不确定如何更正它。我想在主表和子查询表中搜索文本。
这是我的查询
select mytable.*
from mytable
where spam = 0
and deleted = 0
and draft = 0
and (subject like '%guss%' or body like '%guss%' or
(select CONCAT(users.firstname,' ', users.lastname) as fname,users.email
from users where firstname like '%guss%' or lastname like 'guss'))
and id = 24
order by id desc
收到此错误
[Err] 1241 - Operand should contain 1 column(s)
更新#1
select mytable.*
from mytable
where spam = 0
and deleted = 0
and draft = 0
and (subject like '%eli%' or body like '%eli%' or
(select users.firstname
from users where firstname like '%eli%') or
(select users.lastname
from users where lastname like '%eli%'))
and id_receiver = 24
order by id desc
答案 0 :(得分:0)
这里的错误:
(select CONCAT(users.firstname,' ', users.lastname) as fname,users.email
from users where firstname like '%guss%' or lastname like 'guss'))
在您的子查询中,您只能返回一列
这是第一栏:CONCAT(users.firstname,' ', users.lastname) as fname
这是第二栏:users.email
答案 1 :(得分:0)
您将2列结果作为OR表达式的操作数。 这导致了这个问题。它应返回一列或与某些东西进行比较。 但如果你想在两个表中搜索,我猜UNION将是你需要的东西。
答案 2 :(得分:0)
虽然我认为这是错误的,但我不相信mytable.id与users.id有关,但那是评论所说的......
SELECT Distinct mytable.*
FROM mytable
INNER JOIN users
on myTable.ID = users.Id
WHERE mytable.spam = 0
and mytable.deleted = 0
and mytable.draft = 0
and CONCAT_WS(mytable.subject, mytable.body, users.firstname, users.lastname) like '%eli%'
and mytable.id_receiver = 24
ORDER BY mytable.id desc
我删除了或使用字符串连接。我们希望任何记录都包含' eli'在任何列subject,body,firstname,lastname。系统必须循环遍历每列,检查%eli%值。理论上最多4个循环。通过将所有列组合在一起形成一个字符串并检查eli,我们消除了额外的循环,引擎必须在字符串连接的开销处进行。这应该更快。
我使用了distinct,因为我不知道你想要什么结果,以及连接是否会导致多条记录没有用处。由于使用*,我无法正确使用组。
我加入了用户,假设您只想在mytable中链接到用户的记录。这可能是一个错误的假设。