我得到了这个例子,但我想从整体上知道,如何在不使用别名的情况下在MySQL中获取2个同名列?
示例:
$query = "SELECT app.*, categorie.* FROM app JOIN categorie ON app.id = categorie.id";
while ($row = mysql_fetch_array($query)) {
$categorie = $row[categorie.name]; //is there a way to do this?
$aplicativo = $row[app.name];
}
这个例子只是用一个别名来解决,但还有其他方法吗,比如这个例子?感谢您抽出时间
mysql_fetch_array
警告
自PHP 5.5.0起,此扩展已被弃用,并且将在未来被删除。相反,应该使用MySQLi或PDO_MySQL扩展。另请参阅MySQL:选择API指南和相关常见问题解答以了解更多信息。该功能的替代方案包括:
mysqli_fetch_array()
PDOStatement::fetch()
如果结果的两列或多列具有相同的字段名,则最后一列将优先。若要访问同名的其他列,必须使用该列的数字索引或为该列创建别名。对于别名列,不能使用原始列名访问内容。
示例#1使用别名重复字段名的查询
SELECT table1.field AS foo, table2.field AS bar FROM table1, table2
因此,在您的情况下,正如文档所示,查询应该使用别名或数字索引:
SELECT app.name as "app.name",... , categorie.name as "categorie.name",... FROM app JOIN categorie ON app.id = categorie.id
获取行时使用PDO的FETCH_NUM类型,以获得包含两个值的0索引数组,即使它们具有相同的列名。
function selectStuff('PDO $pdo)
{
$stmt = $pdo->prepare('SELECT app.name, categorie.name FROM app JOIN categorie ON app.id = categorie.id');
$stmt->execute();
foreach ($stmt->fetchAll('PDO::FETCH_NUM) as $row) {
// $row[0] contains app.name
// $row[1] contains categorie.name
}
}
您必须利用0索引的列获取,才能在没有别名的情况下实现这一点。原因很简单:如果数组中的两个不同值共享同一个键,则无法从逻辑上访问它们。
请注意,我明确地命名了要选择的列。出于可读性的原因,以及出于性能的原因(可以说,在大多数情况下这并不明显),您应该更喜欢选择所有字段。
免责声明:mysql_fetch_array()我知道这不是最近应该推荐的,但我还没有离开,因为它在我所在的任何PHP 5.x服务器上都运行得很好。很快时间到了,所以我可以重构我的代码库,据我所知,可能会更快。话虽如此。。。
回到你的问题。。。
我在谷歌上搜索,寻找阅读后看到的其他东西,但我开始明白,能够阅读你所要求的东西的整个方法在现实世界中没有实际用处。也就是说,与更改查询相比,添加一些别名如下:
$query="将app.name选为appname,category.name选为categoryName,app.,categore.FROM应用程序在app.id=categore.id上加入categorie";
这样,您返回的查询将返回更多具有唯一名称的字段,这样您就可以按照要求访问它们。
但是,假设您正在寻找一种方法,在不更改sql查询的情况下完成您的要求。你需要知道结果的顺序,尤其是如果列表中有多个不明确的名称,因为你无法对不明确的字段进行重新排序,MySQL会返回你看到的所有字段。这只是数组的工作方式,你没有得到你想要的答案。或者,我的免责声明,这是我应该离开这个MYSQL_FUNCTIONS的原因之一。。。(我希望如此,因为如果是这样的话,这本身就是一个非常好的原因,mysql_fetch_assoc()应该有一个选项来放置一组结果,就像这个例子中的['id','name','id'和'name']一样)
您并没有说您的数据库有什么问题,但是在本例中,它们都有两个列id和name。每个数据库的返回结果将是id、name,或者在查询的情况下,它将是:id、name、id、name
这是怎么回事?mysql_fetch_array()生成的数组如下所示:
假设应用数据库具有值:1,应用名称假设类别数据库有值:2,类别名称
Array
(
[0] => 1
[id] => 2
[1] => 'app name'
[name] => 'category name'
[2] => 2
[3] => 'category name'
)
因此,如果你知道结果的顺序,你至少可以访问不同的字段,即使它们有相同的名称。然而,看看上面的简单例子,很难说[2]是[id]还是[name],但如果你知道顺序。。。
然后再次选择*,然后有人更改数据库。。。添加列。。。
$query = "SELECT app.name as `appname`, categorie.name as `catname`,
and_maybe_other_columns_here
FROM app JOIN categorie ON app.id = categorie.id";
while ($row = mysql_fetch_array($query)) {
$categorie = $row['appname']; //is there a way to do this?
$aplicativo = $row['catname'];
}