簡體   English   中英

引用外部查詢/子查詢的最佳方式?

[英]Best way to reference an outer query / subquery?

我正在嘗試從第三個選擇(子查詢)表中的第一個 select 表中引用一個字段。 但是,當該字段進入查詢的該子級別時,無法識別該字段。 我正在處理的 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')
       )

工作一點我想我可以避免第三級 select 問題。 盡管如此,關鍵是我正在嘗試重用 sql代碼,例如 function 代碼,它為我提供了我選擇的等級的 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

實際上,我認為這可能是我想要的方式,通過使用像@rank 這樣的sql 變量,但我不確定它是否更慢以及是否有其他更好的方法來做到這一點。

在此先感謝您的幫助:)

因此,正如一位評論者所指出的,我認為使用 JOINS 比使用子選擇要好得多。 例如,如果我正確閱讀了您的查詢/問題,您可以執行如下連接查詢:

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

當然,這並不能真正解決您能夠在子 select 的較低級別訪問變量的問題,但它會使您的 SQL 更易於管理,並使其可用於其他語言實現,正如您提到的那樣需要你。

從更大的角度來看,要考慮的其他事情是遷移到提供 ORM 層的 PHP 框架,您可以在其中將這些表變成對象,然后能夠更輕松、更靈活地訪問您的數據(通常)。 但這是非常“大局”,可能不適合您的項目要求。 然而,我可以推薦的一個這樣的框架是 CakePHP。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM