繁体   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