我正在尝试引用第3个选择(子查询)表中第一个选择表中的字段。 但是,当该字段进入查询的子级别时,无法识别该字段。 我正在使用的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
实际上我认为这可能是我想要的方式,通过使用像@rank这样的 sql变量,但我不确定它是否更慢以及是否还有其他更好的方法做到这一点。
提前感谢您的任何帮助:)
答案 0 :(得分:1)
因此,正如一位评论者指出的那样,我认为使用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
当然,这并不能真正解决您在子选择的较低级别访问变量的问题,但它会使您的SQL更易于管理,并使其可用于其他语言实现,就像您一样提到的可能是你的需要。
从更大的角度来看,需要考虑的其他事情是迁移到提供ORM层的PHP框架,您可以将这些表格转换为对象,然后能够更加轻松灵活地访问您的数据(通常情况下)。但这非常“全局”,可能不适合您的项目要求。然而,我可以推荐的一个这样的框架是CakePHP。