从两个内部联接中选择特定字段

时间:2013-06-12 18:00:53

标签: mysql

根据表ContractsContract_PlansContract_Plan_Tags,我可以在内部联接查询中选择所有三个中的特定字段吗?

目前,我有

SELECT * FROM Contracts 
INNER JOIN Contract_Plans
ON Contracts.ContractNum = Contract_Plans.ContractNum
INNER JOIN Contract_Plan_Tags 
ON Contracts.ContractNum = Contract_Plan_Tags.ContractNum 
WHERE Contract_Plan_Tags.tag_id = 44 OR Contract_Plan_Tags.tag_id = 45

此查询返回所有字段,但有没有办法从连接表中选择特定字段?

我知道我能做到

SELECT ContractNum, ContractName FROM Contracts
...
...

但只选择Contracts中的字段,而不选择其他表格。

3 个答案:

答案 0 :(得分:2)

如果要使MySQL区分它们,则必须按字段名称为字段添加前缀:

SELECT Contracts.This, Contract_Plan_Tags.That, Contract_Plans.There FROM Contracts 
INNER JOIN Contract_Plans
ON Contracts.ContractNum = Contract_Plans.ContractNum
INNER JOIN Contract_Plan_Tags 
ON Contracts.ContractNum = Contract_Plan_Tags.ContractNum 
WHERE Contract_Plan_Tags.tag_id = 44 OR Contract_Plan_Tags.tag_id = 45

答案 1 :(得分:2)

您应该了解表别名。最好的表别名是表的简短缩写。然后,您可以列出包含别名的字段:

SELECT c.ContractNum, c.ContractName, cpt.tag_id, . . .
FROM Contracts c
INNER JOIN Contract_Plans cp
ON c.ContractNum = cp.ContractNum
INNER JOIN Contract_Plan_Tags cpt
ON c.ContractNum = cpt.ContractNum 
WHERE cpt.tag_id in (44, 45)

我注意到你在where子句中使用了表名,所以我希望我能正确理解这个问题。您可以在selectwhere(以及group byhaving)子句中使用别名(或表名称)。

答案 2 :(得分:1)

是的,您可以从FROM子句中的任何表中选择任何字段。如果两个表的两个字段具有相同的名称,则必须在字段前添加表的名称(否则您将从解析器中收到错误:“字段名称不明确”)。< / p>

如果您发现它更具可读性,可能前缀明确的字段名称。

实际上它的工作方式与WHERE子句完全相同。

顺便提一下,如果从多个数据库连接表,则存在相同的要求。如果两个表具有相同的名称,则必须在其名称前加上数据库名称,但如果名称是明确的,则不需要。

哦,你也可以这样做:SELECT table1.*, table2.some_field, table3.* FROM...