2011-07-13 40 views
2

我想從第三選擇(子查詢)表中的第一個選擇表中引用一個字段。 但是,該字段在進入查詢的子級別時無法識別。 我正在處理的php代碼使用sql返回將在其他地方使用的sql命令(字符串)的一部分。引用外部查詢/子查詢的最佳方法是什麼?

我想出了這個例子,它顯示了我想解決的那種嵌套查詢。 在這裏,我試圖讓名稱和在晚上工作,有一個可用的工作匹配工作等級用戶的電子郵件:

tables -----------> fields 
table_users  -> [user_id, name, email, rank, ...] 
table_users_jobs -> [user_id, job_id, period, ....] 
table_jobs  -> [job_id, status, rank, ...] 


-- sql calling code -> $rank = "t1.rank"; get_users_info_by_rank($rank); 
-- maybe using: SET @rank = NULL; SELECT @rank := $rank, t1.name, ... 
    SELECT t1.name, t1.email 
    FROM table_users as t1 
    WHERE t1.user_id IN (
     SELECT t2.user_id 
     FROM table_users_jobs as t2 
     WHERE t2.period = 'night' AND 
     t2.job_id IN (
--   avaiable jobs to that rank -> get_job_ranks_sql($rank); 
      SELECT t3.job_id 
      FROM table_jobs as t3 
--   maybe using: t3.rank = @rank 
      WHERE t3.rank = t1.rank AND 
      t3.status = 'avaiable_position') 
     ) 

工作一點我想我能避開第三級選擇問題。然而問題是,我試圖重用的SQL代碼一樣,讓我說,我選擇了排名的JOB_ID功能:

function get_job_ranks_sql($rank){ 
    //probably 't3' will be renamed for something more unique 
    return 'SELECT t3.job_id 
      FROM table_jobs as t3 
      WHERE t3.rank = '.$rank.' AND 
      t3.status = "available_position")'; 
    } 

即使使用PHP我試圖使它通用於可能如果可能,請使用其他語言。 使用SQL版本:MySQL 5.1.41

其實我認爲這是可能的方式我想,通過使用SQL 變量像@rank,但我不知道它的速度較慢,如果有其他更好的方法來做到這一點。

預先感謝任何幫助:)

+0

你有使用內嵌視圖(嵌套選擇語句)的原因嗎?你可以用連接完成所有這些...... – Nate

+0

這只是一個簡單的例子。通常情況下它會複雜得多,最終的sql是通過連接一些在中間返回sql的函數形成的,比如我在那裏放置的get_job_ranks_sql – Seeker

回答

1

所以,作爲一個評論者指出的那樣,我認爲你會使用連接,比子選擇做的好得多。例如,如果我正確閱讀您的查詢/問題,你可以做這樣的連接查詢:

SELECT t1.name, t1.email, t3.job_id 
FROM table_users t1 
LEFT JOIN table_users_job t2 
ON t1.user_id = t2.user_id 
LEFT JOIN table_jobs t3 
ON t3.job_id = t2.job_id 
WHERE t2.period = 'night 
AND t3.status = 'available_position' 

這是很多更簡潔,更易於閱讀,併爲您的數據庫更容易。但是這樣做會阻止你模塊化你的SQL。如果這非常重要,那麼可以考慮將這些查詢存儲在存儲過程中。這樣,您實際上可以讓SP返回結果列表。看看這個教程:

http://www.wellho.net/resources/ex.php4?item=s163/stp4

當然,這並不能真正解決您的是能夠在較低的水平選擇子來訪問變量的問題,但它會使你的SQL更容易管理並使其可用於其他語言實現,正如您提到的那樣可能對您有所需求。

從更大的角度來看,還需要考慮將其遷移到提供ORM層的PHP框架,在那裏您可以將這些表製作爲對象,然後以更加輕鬆和靈活的方式訪問您的數據(通常)。但這是非常「大局」,可能不適合您的項目需求。然而,我可以推薦的一個這樣的框架是CakePHP。

+0

模塊化我的sql對我來說是一個優先事項。我在php中的部分代碼已經在模塊中使用函數返回sql來用於其他函數等等:但是,因爲我傳遞了像't1'這樣的sql語句。排名'而不是像'rank1'這樣的直接值在函數參數中失敗的一些子函數中。我試圖使用sql變量(@rank),它似乎可以工作,但我不確定我是否能夠正確地實現它,如果有更好的方法。 Ty關於模塊化sql的鏈接,我稍後會檢查它。 – Seeker

+1

在這種情況下,我肯定會推薦大量使用存儲過程。很多人不喜歡他們,而其他人則將他們的整個系統構建在SP上。就你而言,我甚至會主張使用更簡單的SP來構建應用程序可能調用的更復雜的SP。順便說一句,該鏈接只能真實地說明你可以從SP獲得結果列表的事實;並沒有真正進入使用基於SP系統的完整格式。如果你研究SP,並且不喜歡在DB上如此沉重,那麼考慮升級到一個框架 - 讓你不必在家裏釀造大量的代碼。 – user470714

相關問題