0

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

例如:

筛选:

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

查询一:

$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 更改为

$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 ";

还是有什么其他方法?

我不是这个程序的主要开发者,只是一个错误修复者,所以我不能改变这个程序的大部分内容(因为这些查询可能会影响另一个页面)。

4

3 回答 3

0

将整个事情包装在一个外部查询中,如下所示:

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

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

于 2013-08-20T13:58:09.877 回答
0

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

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

我强烈建议也使用 backtics 和 ticks,它有助于避免表或字段名称(如“order”)的有趣错误:)

那么您只需要确保需要应用标准的表每次都获得正确的别名

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

于 2013-08-20T09:24:51.180 回答
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 ";

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

于 2013-08-20T09:38:22.743 回答