如何在使用PDO加入后获得正确的列?

时间:2011-10-03 18:53:36

标签: php pdo

我有两个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字段。

3 个答案:

答案 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 ...