繁体   English   中英

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指南和相关的FAQ,以获取更多信息。 此功能的替代方法包括:

mysqli_fetch_array()
PDOStatement::fetch()

如果结果的两列或更多列具有相同的字段名称,则最后一列优先。 要访问其他相同名称的列,必须使用该列的数字索引或为该列创建别名 对于别名列,您无法使用原始列名访问内容。

Example#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服务器上仍然运行良好。 很快时间到了,这样我就可以重构我的代码库,就我所知,maby甚至更快。 话虽如此...

回到您的问题...

我一直在使用Google搜索,正在寻找阅读后还能看到的东西,但是我开始理解,能够阅读您所要求的整个方法在现实世界中没有实际用途。 也就是说,与更改查询相比,添加一些别名是这样的:

$ query =“选择app.name AS appname,categorie.name AS categoriename,app。 ,categorie。FROM app JOIN categorie ON app.id = categorie.id”;

这样,您返回的查询将返回更多具有唯一名称的字段,以便您可以按要求访问它们。

但是,说您正在寻找一种无需更改sql查询即可完成您所要求的方法的方法。 您需要知道结果的顺序,特别是如果列表中有多个不明确的名称,因为您将无法对不明确的字段进行重新排序,MySQL确实会返回所有字段,您所看到的只是数组工作的方式没有得到你想要的答案。 或者,我的免责声明,这是我应该退出此MYSQL_FUNCTIONS的原因之一...(我希望如此,因为如果这是一个该死的伟大原因,则mysql_fetch_assoc()应该可以选择放置一系列结果对于此示例将是['id','name','id','name'])

您没有说任何有关数据库的信息,但是说在这个示例中,它们都有两个列id和name。 每个数据库的返回结果将是ID,名称,或者在查询的情况下将是:ID,名称,ID,名称

这是如何运作的? 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'];
 }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM