Mysql在不使用别名的情况下联接具有相同列名的2个表


Mysql join 2 table with same column name without using an alias

我得到了这个例子,但我想从整体上知道,如何在不使用别名的情况下在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'];
 }
相关文章: