2010-03-12 5 views
1

SELECT *이 FROM (DISTINCT 작업을 선택 jobs * 작업 FROM (jobs.user_id = 1) OR (job_requests.user_id 를 job_requests 레일 1 개 컬럼 (들)을 포함한다 = 1 AND job_requests.job_id = jobs.id) )SQL 쿼리 오류 :. 피연산자

이 SQL이 날 수 있습니다 : 나는 where 절에서 선택을 실행하면

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

그것이

작동을
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에 의해 생성되므로 기본 선택이 필요합니다.

ROR 코드 :

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"))' 
+0

당신이 RoR에 코드를 표시 할 수 그런 쿼리를 생성합니까? – klew

+0

예, 나는 ror 코드도 추가했습니다. 기본적으로 나는 사용자가 소유자이고 그가 어디에 적용되는지 (job_requests를 통해 작업이 있음) 작업을 검색하려고하지만 추가 필터링을 위해 함께 사용하기를 원합니다. – dombesz

답변

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으로 변환 될 수 있습니다.

Jobs.for_user(current_user) 
+0

재미있는 것 같아요,하지만 내 유일한 문제는 내가 이름 범위와 결과 집합을 추가로 필터링하려는 것입니다. 여기에 명명 된 범위를 적용 할 수 있습니까? – dombesz

+0

내 대답에 named_scope 코드를 추가했습니다. 한번보세요 –

+0

신난다, 정말 고마워. – dombesz

0

내가 제대로 이해 한 당신은 내가 당신을 추측하고있어

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

로 내부 쿼리가 true 인 경우에만 작업에서 선택합니다 재구성해야하는 경우 , 위는 당신을 위해 이것을 할 것입니다. 주어진 user에 대한 job requestsjobs을 얻으려면

+0

나는 ror에도 통합 될 수있는 솔루션을 찾고 있습니다. – dombesz

0

다음 코드는 작동합니다 : 내가 제공하는 추가 정보를 기반으로 내 대답을 제출하고

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

이런 식으로 뭔가 문제가 있지만이 경우에는 사용자 ID가 일치하지 않는 작업을 다시 돌려주지 않을 것입니다. 조건은 다음과 같습니다. 또는 사용자가 작업 소유자 (jobs.user_id = user_id)이거나 작업 요청을 통해 작업에 적용되었습니다 (job_request.user_id = user_id AND job_request.job_id = jobs.id). 희망이 의미가 있습니다. – dombesz

+0

질문에 대한 다른 답변을 추가했습니다.귀하의 시나리오를 커버해야합니다 –

1

SQL 쿼리 : 문서

MySQL은 말했다

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 
다음과 같이

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를 사용할 수있는 문서를

#1241 - Operand should contain 1 column(s) 
관련 문제