mysql在主查询和子查询中搜索

时间:2014-09-03 15:04:30

标签: mysql sql

在我尝试在查询中搜索以下查询时,我可能正在编写错误的语法,但我不确定如何更正它。我想在主表和子查询表中搜索文本。

这是我的查询

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

3 个答案:

答案 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中链接到用户的记录。这可能是一个错误的假设。