我得到了这个例子,但我想总体上知道如何在不使用别名的情况下在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];
}
这个例子只是用别名来解决,但还有另外一种方法,比如示例吗?谢谢你的时间
答案 0 :(得分:7)
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
答案 1 :(得分:1)
在获取行时使用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索引的列提取才能在没有别名的情况下执行此操作。原因很简单:如果它们共享相同的密钥,则无法在逻辑上访问数组中的两个不同值。
请注意,我明确地命名了要选择的列。出于性能原因,您应该更倾向于选择所有字段,出于可读性原因,并且(在大多数情况下,这可能是不明显的)。
答案 2 :(得分:0)
免责声明:mysql_fetch_array() 我知道这不是应该推荐的日子,但我还没有离开,因为它仍然在我所在的任何PHP 5.x服务器上运行良好。很快就会有时间,所以我可以尽快重构我的代码库,甚至更快。那就是说......
回到你的问题......
我正在谷歌搜索并寻找我在阅读后看到的其他东西,但我开始明白,能够阅读你要求的整个方法在现实世界中没有实际用途。也就是说,与更改查询相比,添加一些这样的别名:
$ query =" SELECT 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,name或者在查询的情况下它将是:id,name,id,name
这是如何工作的? mysql_fetch_array()的结果数组如下所示:
说app db有值:1,app name 说类别db具有值:2,类别名称
Array
(
[0] => 1
[id] => 2
[1] => 'app name'
[name] => 'category name'
[2] => 2
[3] => 'category name'
)
因此,如果您知道结果的顺序,即使它们具有相同的名称,您也可以访问不同的字段。然而,看一下上面的简单例子,很难说[2]是[id]还是[name],但如果你知道订单......
然后再次选择*并且有人更改了数据库...添加了一个列......
答案 3 :(得分:-1)
$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'];
}