我遇到了这个问题,现在已经尝试解决了几天。
假设我有以下表格
属性
-----------------------------------------
| id | address | building_material |
-----------------------------------------
| 1 | Street 1 | 1 |
-----------------------------------------
| 2 | Street 2 | 2 |
-----------------------------------------
building_materials
-----------------------------
| id | building_material |
-----------------------------
| 1 | Wood |
-----------------------------
| 2 | Stone |
-----------------------------
现在。我想提供一个API,您可以在其中发送请求并询问具有木材建筑材料的每个属性。像这样:
myapi.com/properties?building_material=Wood
所以我想这样查询数据库(我想返回building_material的字符串值而不是数字值):
SELECT p.id, p.address, bm.building_material
FROM properties as p
JOIN building_materials as bm ON (p.building_material = bm.id)
WHERE building_material = "Wood"
但这会给我一个错误
where子句中模棱两可的列“ building_material”
另外,如果我想获取ID为1的属性。
SELECT p.id, p.address, bm.building_material
FROM properties as p
JOIN building_materials as bm ON (p.building_material = bm.id)
WHERE id = 1
where子句中的列“ id”不明确
我知道该错误意味着我在两个表中具有相同的列名,并且没有像p.id那样指定我想要的ID。
问题是我不知道API用户将发送多少个查询参数,我想避免循环浏览它们并将 id 更改为 p.id 和 building_material 到 bm.building_material 。另外,我不希望该用户像这样向API发送请求
myapi.com/properties?bm.building_material=Wood
我已经考虑过将属性表 building_material 更改为 fk_building_material 并将属性表 id 更改为 property_id 。
我只是不喜欢这样的想法,即在客户端,我必须将房地产的建筑材料称为fk_building_material。这是解决此问题的有效方法,还是设计这些表的正确方法是什么?
答案 0 :(得分:0)
该查询提到了两个表,因此两个表中的所有列都在“表上”,可在查询中的任何地方使用。
在一个表中,building_material
是用于链接到另一个表的“ id”;在另一个表中,它是一个字符串。尽管这是可能的,但是这会使读者感到困惑。并解析器。要解决这种混乱,您必须使building_material
符合您的要求;这是通过在前面使用表别名(或表)来完成的(就像您在所有其他地方所做的一样)。
有两个ids
都是模棱两可的。但这是表设计人员使用的“惯例”。因此,一个表中的id
与另一表中的id不同是可以的。 (p.id
指一个表中的一件事; bm.id
指另一表中的另一件事。)
SELECT p.id, p.address, bm.building_material
FROM properties as p
JOIN building_materials as bm ON (p.building_material = bm.id)
WHERE bm.building_material = "Wood" -- Note "bm."