检索表别名

时间:2013-08-20 09:14:53

标签: php postgresql alias

我有几个具有相同过滤器的查询。

例如:

过滤器:

$criteria = "AND id_student = 1 AND id_major = 2 ";

查询1:

$query1 = "SELECT * FROM student AS t0
LEFT JOIN major AS t1 ON t0.id_major = t1.id
WHERE 1=1 ";

查询2:

$query2 = "SELECT * FROM lecturer AS t0
LEFT JOIN major AS t1 ON t0.id_major = t1.id
LEFT JOIN student AS t2 ON t2.id_major = t1.id
WHERE 1=1 "

它将以

运行
$query1.$criteria 

$query2.$criteria

正如您所看到的,这将产生查询错误,因为id_major是不明确的。

我的问题是,这个查询的数量非常大,所以我不想单独硬编码和更改$ criteria和$ query。

我试图将$条件更改为

$criteria = "AND student.id_student = 1 AND major.id_major = 2 ";

但它没有更好,它给了我“你的意思是t0”,“你的意思是t2”等错误。

那么,我可以做一些像表格一样的别名吗?所以我可以把它放在$ criteria

$criteria = "AND (get-alias-code).id_student = 1 AND (get-alias-code).id_major = 2 ";

或任何其他方法?

我不是这个程序的主要开发人员,只是一个bug修复程序,因此我无法更改此程序的大部分内容(因为这些查询可能会影响另一个页面)。

3 个答案:

答案 0 :(得分:0)

使用您已拥有的表的别名,并将条件设置为

$criteria = "AND t0.`id_student`='1' AND t1.`id_major`='2' ";

我强烈建议使用backtics和ticks,它有助于避免使用像'order'这样的表或字段名称的有趣错误:)

然后,您需要确保的是,每次需要应用条件的表都会获得正确的别名

编辑: 嗯......或者,您可以从所有查询中删除别名。 老实说,我不认为有任何mysql功能来获取表的别名。您可以运行字符串分析器代码片段来查找它们(知道所有表名称甚至可能都不难)但这看起来像是一个非常丑陋的解决方案恕我直言。

答案 1 :(得分:0)

我不知道在sql上处理它,但你可以用数组来处理它,例如

$alias[1]["student"] = "t0"; // it means on query 1 your alias for student is t0

现在您可以在过滤器上使用此变量

$criteria = "AND ".$alias[1]["student"].".id_student = 1 AND ".$alias[1]["major"].".id_major = 2 ";

我认为这是在不更改所有查询的情况下更改过滤器的快速方法之一。 希望它有所帮助

答案 2 :(得分:0)

将整个事物包装在这样的外部查询中:

"SELECT * FROM (".$query1.") a ".$criteria;

当然假设原始查询没有创建多个具有相同名称的列,您现在可以在没有别名的情况下引用它们。

相关问题