我在MySQL数据库中有几个表,对于这些表,大多数SELECT查询都会引用每个表中相同值的同名列。
因此,例如,表(bnsf、train_plan、train_type和operation_costs)将ALL具有一个名为">train_id"的字段。
根据记录/行的不同,"train_id"列上的值可能是1、2、3、4、5等。但在查询的大多数时候,所需的结果都是针对这些值与给定值匹配的记录,例如">2"。
所以像这样的查询有效:
SELECT * FROM (((bnsf
INNER JOIN train_plan ON bnsf.train_id = train_plan.train_id)
INNER JOIN train_type ON train_plan.train_id = train_type.train_id)
INNER JOIN operation_costs ON train_type.train_id = operation_costs.train_id)
WHERE bnsf.train_id = 2
AND train_plan.train_id = 2
AND train_type.train_id = 2
AND operation_costs.train_id = 2;
有没有更简单的方法来编写该查询(特别是WHERE条款)?本质上是这样的:
WHERE `train_id` IN TABLE(bnsf, train_plan, train_type, operation_costs) = 2;
// invalid syntax
我希望避免使用AND、AND、AND,并且必须为每个表重复相同的值。我有作品,但看起来不太优雅。有什么想法吗?
我花了很长时间阅读其他帖子,但我不喜欢工会等的建议。(似乎不会更短)
您的联接条件使得除了第一个WHERE子句之外的所有子句都是多余的。
INNER JOIN train_plan ON bnsf.train_id = train_plan.train_id)
仅选择与bnsf.train_id
匹配的train_plan
行,对于其他几张桌子更进一步。
所以当你说
WHERE bnsf.train_id = 2
然后将该列上的其他表连接起来,就可以保证它们都相等。
SELECT * FROM (((bnsf
INNER JOIN train_plan ON bnsf.train_id = train_plan.train_id)
INNER JOIN train_type ON train_plan.train_id = train_type.train_id)
INNER JOIN operation_costs ON train_type.train_id = operation_costs.train_id)
WHERE bnsf.train_id = 2
这是一个非常合理的问题。