Php 如何输出使用别名的MySQL查询结果?

Php 如何输出使用别名的MySQL查询结果?,php,mysql,echo,alias,self-join,Php,Mysql,Echo,Alias,Self Join,我有两个主要的MySQL表(profiles和contacts)和许多补充表(前缀为prm)。它们通过PHP进行访问和操作 在本例中,我查询profiles表,在该表中我将检索所有者ID和繁殖者ID。然后,这将对照contacts表引用,contacts表中保存了所有者和繁殖者的信息 在关于连接和别名的另一个问题上,我在这里得到了很大的帮助,我还收到了以下查询。不幸的是,我很难说出结果。每一个处理自连接和别名的站点都提供了很好的查询示例,但随后跳到“和此输出等”。它是如何输出的 SELECT *

我有两个主要的MySQL表(profiles和contacts)和许多补充表(前缀为prm)。它们通过PHP进行访问和操作

在本例中,我查询profiles表,在该表中我将检索所有者ID和繁殖者ID。然后,这将对照contacts表引用,contacts表中保存了所有者和繁殖者的信息

在关于连接和别名的另一个问题上,我在这里得到了很大的帮助,我还收到了以下查询。不幸的是,我很难说出结果。每一个处理自连接和别名的站点都提供了很好的查询示例,但随后跳到“和此输出等”。它是如何输出的

SELECT *
FROM (
      SELECT *
         FROM profiles
              INNER JOIN prm_breedgender
                  ON profiles.ProfileGenderID = prm_breedgender.BreedGenderID
              LEFT JOIN contacts ownerContact
                  ON profiles.ProfileOwnerID = ownerContact.ContactID
              LEFT JOIN prm_breedcolour
                  ON profiles.ProfileAdultColourID = prm_breedcolour.BreedColourID
              LEFT JOIN prm_breedcolourmodifier
                  ON profiles.ProfileColourModifierID = prm_breedcolourmodifier.BreedColourModifierID
) ilv LEFT JOIN contacts breederContact
     ON ilv.ProfileBreederID = breederContact.ContactID
WHERE ProfileName != 'Unknown'
ORDER BY ilv.ProfileGenderID, ilv.ProfileName ASC $limit
与此相结合的是以下PHP:

$owner = ($row['ownerContact.ContactFirstName'] . ' ' . $row['ownerContact.ContactLastName']);
$breeder = ($row['breederContact.ContactFirstName'] . ' ' . $row['breederContact.ContactLastName']);
除联系人(性别、颜色等)外的所有详细信息均返回正常状态。
$owner
$breeder
变量为空

如果能帮我解决这个问题,我将不胜感激

编辑:我的最终工作查询:

SELECT ProfileOwnerID, ProfileBreederID, 
        ProfileGenderID, ProfileAdultColourID, ProfileColourModifierID, ProfileYearOfBirth, 
        ProfileYearOfDeath, ProfileLocalRegNumber, ProfileName,
        owner.ContactFirstName AS owner_fname, owner.ContactLastName AS owner_lname,
        breeder.ContactFirstName AS breeder_fname, breeder.ContactLastName AS breeder_lname,
        BreedGender, BreedColour, BreedColourModifier

        FROM profiles
                    LEFT JOIN contacts AS owner
                        ON ProfileOwnerID = owner.ContactID
                    LEFT JOIN contacts AS breeder
                        ON ProfileBreederID = breeder.ContactID
            LEFT JOIN prm_breedgender
                        ON ProfileGenderID = prm_breedgender.BreedGenderID
                    LEFT JOIN prm_breedcolour
                        ON ProfileAdultColourID = prm_breedcolour.BreedColourID
                    LEFT JOIN prm_breedcolourmodifier
                        ON ProfileColourModifierID = prm_breedcolourmodifier.BreedColourModifierID

                  WHERE ProfileName != 'Unknown'
            ORDER BY ProfileGenderID, ProfileName ASC $limit
然后我可以通过以下方式输出:

$owner = ($row['owner_lname'] . ' - ' . $row['owner_fname']);

多谢大家

在外部选择上,您只有两个表:

(inner select) as ilv
contacts as breederContact

根本没有所有者联系

您需要用所需的数据替换*号,类似的数据也需要制作别名: ownerContact.ContactFirstName作为所有者\u ContactFirstName 和 breederContact.ContactFirstName作为breeder\u ContactFirstName

像这样:

从配置文件中选择ownerContact.ContactFirstName作为所有者\u ContactFirstName,选择BrederContact.ContactFirstName作为繁殖者\u ContactFirstName加入ownerContact。。。等

通过这种方式,您将编写:

$owner = ($row['owner_ContactFirstName'] . ' ' . $row['owner_ContactLastName']);
$breeder = ($row['breeder_ContactFirstName'] . ' ' . $row['breeder_ContactLastName']);

使用php访问行时不能指定表别名。如果您没有两个同名字段,那么通过
$row['ContactFirstName']
访问它就可以了。在这种情况下,第二个出现的
ContactFirstName
将覆盖第一个

将查询更改为使用字段别名,这样您就可以执行
$owner=$row['owner\u ContactFirstName']


我不能100%确定的另一个选项是按索引而不是按名称访问字段(例如,
$owner=$row[11]
)。即使它能工作,我也不建议这样做,如果稍微更改一下查询,您也会遇到很多麻烦。

我猜您正在使用
mysql\u fetch\u array
mysql\u fetch\u assoc
函数从结果集中获取数组

在这种情况下,您不能使用

$row['ownerContact.ContactFirstName']
作为:

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

因此,您可以在SQL查询中使用
AS
为加倍的行设置其他名称,也可以使用编号的索引来访问它们


这可能是这样的:

在查询中使用
作为
在标准SQL查询中,结果集中的列的命名与它们的值来自的列类似。有时,由于命名冲突,这可能是一个问题。在查询中使用
AS
-命令,可以重命名结果集中的列:

SELECT something AS "something_else"
FROM your_table
$row[0] // would be the "first_name"-column
$row[1] // would be the "last_name"-column
这将把
something
-列重命名为
something\u else
(您可以将
-引号保留在外,但我认为这会使它更具可读性)

使用数组的列索引 另一种方法是使用列索引而不是它们的名称。看看这个查询:

SELECT first_name, last_name
FROM some_table
结果集将包含两列,
0==>first\u name
1==>last\u name
。您可以使用此数字访问结果集中的列:

SELECT something AS "something_else"
FROM your_table
$row[0] // would be the "first_name"-column
$row[1] // would be the "last_name"-column

为了能够使用列索引,您需要使用
mysql\u fetch\u row
mysql\u fetch\u assoc
-函数,该函数提供关联数组、数字数组或两者(“两者”都是标准的)。

您是否尝试打印$row以查看输出结果?我不认为别名是散列的一部分。打印一个打印将告诉您值是如何出来的,我的意思是查看$row上的散列名称而不是值。使用print\r($row)将吐出数据结构上使用的实际哈希名称。它实际上是为所有者和繁殖者返回正确的值。。。但这不是翻译,如果你通过名字(“ContactFirstName”)访问它们,你只会得到“第二个”(繁殖者的)名字。似乎我需要为内部和外部查询中的列指定别名,而不是使用*符号?okaaaay-但是我要更改哪一个*?两者都有?更改第二个应该足够所有者联系人在内部联接中,不是吗?你能给我举个例子吗?我正试图让它在这里发挥作用,但它没有发生……先生,你是一位学者和绅士!所以,如果我说
选择ProfileOwnerID作为所有者,ProfileBreederID作为繁殖者,等等
。我的左连接和回声是什么样子的?我只是想在我放你走之前确定一下p在
选择
-条件中记录了
AS
-命令。因此,与其使用
SELECT*
,不如使用
将您的姓名选择为“您的首选姓名”
。这对您的联接没有影响。