![](/img/trans.png)
[英]mysql php query same table 5 times using the same alias but use that alias for a different column each time
[英]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.