【问题标题】:Sql query Error: Operand should contain 1 column(s) in railsSql 查询错误:操作数应在 rails 中包含 1 列
【发布时间】:2010-03-12 17:38:48
【问题描述】:

选择 * 来自jobs WHERE(选择不同的工作。* FROM 工作,job_requests WHERE (jobs.user_id = 1) 或 (job_requests.user_id = 1 AND job_requests.job_id = jobs.id) )

这个sql给了我:

Mysql::Error: Operand should contain 1 column(s). 

如果我从 where 子句中执行选择,它会起作用

SELECT DISTINCT jobs.* FROM jobs, job_requests 
WHERE  (jobs.user_id = 1) OR 
       (job_requests.user_id = 1 AND job_requests.job_id = jobs.id)

有人能解释一下为什么吗?此查询由 rails activerecord 生成,因此需要主选择。

密码:

has_many :my_jobs, :class_name=>"Job", :finder_sql =>
    'SELECT DISTINCT jobs.* ' +
    'FROM jobs, job_requests ' +
    'WHERE (jobs.user_id = #{id}) OR ' +
    '(job_requests.user_id = #{id} AND job_requests.job_id = jobs.id AND job_requests.request_status IN ("requested", "confirmed") )'

【问题讨论】:

  • 你能显示生成此类查询的 RoR 代码吗?
  • 是的,我也添加了 ror 代码。基本上我想检索用户是所有者的工作和他被应用的工作(通过job_requests有工作),但我希望它们一起进行进一步过滤。

标签: sql mysql ruby-on-rails activerecord


【解决方案1】:

我正在根据提供的其他信息提交我的答案。下面的查询应该可以满足您的要求。

Job.all(:conditions=> [ " 
 jobs.user_id = ? OR 
 EXISTS (
   SELECT * 
   FROM   job_requests AS B
   WHERE  B.job_id = jobs.id AND B.user_id = ?
 )", user_id, user_id ]
)

如果您想要同一查询的高效版本,那么您应该使用 UNION。

sql = "
  SELECT * 
  FROM   jobs A WHERE A.user_id = ?
 UNION
  SELECT * 
  FROM   jobs A, job_requests B 
  WHERE  A.id = B.job_id AND B.user_id = ?
 "    
Job.find_by_sql(Job.send(:sanitize_sql_array, [sql, user_id, user_id]))

第一个查询可以转换为named_scope

class Job < ActiveRecord::Base

  named_scope :for_user, lambda { |user_id| { :conditions=> [ " 
     jobs.user_id = ? OR 
     EXISTS (
       SELECT * 
       FROM   job_requests AS B
       WHERE  B.job_id = jobs.id AND B.user_id = ?
     )", user_id, user_id ] }
  }
end

现在您可以按如下方式使用named_scope:

Jobs.for_user(current_user)

【讨论】:

  • 看起来很有趣,但我唯一的问题是我想用名称范围进一步过滤结果集。可以在这里应用命名范围吗?
【解决方案2】:

SQL 查询:文档

SELECT (
'95.86.122.224', NOW( ) , '95.86.122.224', '95.86.122.224'
)
FROM orders
LEFT JOIN visitors ON visitors.ip = '95.86.122.224'
WHERE visitors.ip IS NULL
LIMIT 0 , 30

MySQL 说:文档

#1241 - Operand should contain 1 column(s) 

【讨论】:

    【解决方案3】:

    如果我对你的理解正确,你需要重组为

    SELECT * FROM jobs 
     WHERE EXISTS 
           (SELECT DISTINCT jobs.* 
              FROM jobs, job_requests 
             WHERE (jobs.user_id = 1) 
                OR (job_requests.user_id = 1 AND job_requests.job_id = jobs.id))
    

    我猜您只想从内部查询为真的工作中进行选择,上面将为您执行此操作。

    【讨论】:

    • 我正在寻找一种可以集成到 ror 中的解决方案。
    【解决方案4】:

    如果您想为给定的user 获取jobsjob requests,以下代码将起作用:

    Job.all( :joins      => :jobs_requests, 
             :conditions => ["job_requests.user_id = ?", user_id])
    

    【讨论】:

    • 类似这样,但问题是在这种情况下,我不会退回用户 ID 不匹配的工作。条件是:或者用户是工作的所有者(jobs.user_id = user_id),或者他通过工作请求(job_request.user_id = user_id AND job_request.job_id = jobs.id)申请工作。希望这是有道理的。
    • 我为您的问题添加了另一个答案。它应该涵盖您的场景
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-23
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多