2010-03-12 143 views
1

SELECT * FROM jobs WHERE(SELECT DISTINCT作業* FROM作業,job_requests WHERE(jobs.user_id = 1)OR (job_requests.user_id。 = 1 AND job_requests.job_id = jobs.id) )SQL查詢錯誤:操作數應包含在軌道1列(多個)

這個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生成,因此需要進行主選擇。

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 2010-03-12 19:40:05

+0

是的,我也添加了ror代碼。基本上我想檢索用戶是所有者和他應用的工作(通過job_requests有工作)的工作,但我希望他們一起進一步篩選。 – dombesz 2010-03-13 00:57:52

回答

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

如果你想要一個同樣的查詢的高效版本,那麼你應該去與UNIONs。

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

看起來很有趣,但我唯一的問題是,我想進一步過濾名稱範圍的結果集。可以在這裏應用命名範圍嗎? – dombesz 2010-03-14 12:00:13

+0

我已將named_scope代碼添加到我的答案中。看看 – 2010-03-14 16:07:42

+0

真棒,非常感謝。 – dombesz 2010-03-15 11:27:29

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

我猜你只是想從工作選擇其中內部查詢是真,上面會爲你做這個。

+0

我正在尋找一種解決方案,可以集成在ror中。 – dombesz 2010-03-14 12:15:46

0

下面的代碼將工作,如果你想獲得jobsjob requests對於給定user

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

這樣的事情,但問題是,在這種情況下,我不會給回用戶身份不匹配的工作。條件是:或者用戶是作業的所有者(jobs.user_id = user_id),或者通過作業請求(job_request.user_id = user_id和job_request.job_id = jobs.id)申請作業。希望這是有道理的。 – dombesz 2010-03-13 01:02:29

+0

我爲您的問題添加了另一個答案。它應該涵蓋你的場景 – 2010-03-13 01:35:25

1

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) 
相關問題