Ошибка SQL-запроса: операнд должен содержать 1 столбец (столбцы) в рельсах - PullRequest
1 голос
/ 12 марта 2010

ВЫБРАТЬ * ОТ jobs ГДЕ (ВЫБЕРИТЕ РАЗЛИЧНЫЕ вакансии. * ОТ рабочих мест, job_requests ГДЕ (jobs.user_id = 1) ИЛИ (job_requests.user_id = 1 И 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") )'

Ответы [ 4 ]

1 голос
/ 30 января 2011

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) 
1 голос
/ 13 марта 2010

Я отправляю свой ответ на основании предоставленной дополнительной информации. Приведенный ниже запрос должен соответствовать вашему требованию.

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)
0 голосов
/ 12 марта 2010

Следующий код будет работать, если вы хотите получить jobs с job requests для данного user:

Job.all( :joins      => :jobs_requests, 
         :conditions => ["job_requests.user_id = ?", user_id])
0 голосов
/ 12 марта 2010

Если я вас правильно понял, вам нужно изменить структуру на

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))

Полагаю, вы хотите выбрать только те задания, для которых внутренний запрос имеет значение "истина", приведенные выше сделают это за вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...