我有两个MySql表,如下所示:
Cat
------
id : INT NOT NULL PRIMARY KEY
name : VARCHAR(32)
Cheezburger
-------
id : INT NOT NULL PRIMARY KEY
catId : INT FOREIGN KEY REFERENCES Cat (id)
pattyCount : INT
当我使用PHP的PDO在两个表上执行LEFT JOIN
时,我会执行以下操作:
$database = new PDO("mysql:host=$hostname;dbname=$dbname", $username, $pasword);
$query = $database->prepare('
SELECT * FROM Cat
LEFT JOIN Cheezebuger.id ON Cheezburger.catId = cat.id
WHERE Cat.id = ?');
$query->bindParam(1, $someId);
$query->execute();
$cat = $query-fetch();
我的问题是,如何区分与id
表关联的Cat
字段和与id
表关联的Cheezburger
字段? $cat['id']
正在向我提供Cheezburger
id
字段。
答案 0 :(得分:3)
SELECT *
通常是不可取的。相反,要明确您想要的列并将别名分配给同名列:
SELECT
Cat.id AS catid,
Cat.name AS name,
Cheezeburger.id AS chzid,
...
FROM
Cat LEFT JOIN Cheezebuger.id ON Cheezburger.catId = cat.id
WHERE Cat.id = ?
现在,要检索Cat.id
,使用$cat['catid']
并检索Cheezeburger.id
,请使用$cat['chzid']
。
反对执行SELECT *
的一个强有力的理由是,如果稍后在应用程序的这个特定部分中添加更多列,则不会在数据库服务器上使用额外的内存来检索不需要的数据,将其提取到不会使用它的Web应用程序中。如果您以后碰巧添加了二进制BLOB列,则可能会不必要地拖拽更多数据。
另一个原因是你发现的那个。您可以在列名中引用歧义。
答案 1 :(得分:0)
避免使用'lazy'*
并明确指定您想要的字段:
SELECT cat.ID AS catID, Cheezeburger.id AS icanhaz ...
答案 2 :(得分:0)
您需要枚举这些字段,然后将它们列出来,这就像
SELECT cat.id as catId, cat.name, cheezburger.id as cheezId ...