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

Eam*_*onn 0 php mysql alias self-join echo

我有两个主要的MySQL表(配置文件和联系人)和许多补充表(以prm_为前缀).它们通过PHP访问和操作.

在这个例子中,我正在查询配置文件表,我将在其中检索所有者ID和育种者ID.然后将针对联系人表格引用该表格,其中保留了所有者和育种者的信息.

关于连接和别名的另一个问题我在这里得到了很大的帮助,在那里我也提供了以下查询.不幸的是,我在实际回应结果方面遇到了巨大的困难.处理自联接和别名的每个站点都提供了可爱的查询示例 - 但随后跳到"和此输出等等".它是如何输出的?

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
Run Code Online (Sandbox Code Playgroud)

再加上这个是以下PHP:

$owner = ($row['ownerContact.ContactFirstName'] . ' ' . $row['ownerContact.ContactLastName']);
$breeder = ($row['breederContact.ContactFirstName'] . ' ' . $row['breederContact.ContactLastName']);
Run Code Online (Sandbox Code Playgroud)

所有细节除了联系人(性别,颜色等)返回罚款.在$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
Run Code Online (Sandbox Code Playgroud)

然后我可以输出:

$owner = ($row['owner_lname'] . ' - ' . $row['owner_fname']);
Run Code Online (Sandbox Code Playgroud)

非常感谢大家!

Luk*_*uth 5

我猜你是使用mysql_fetch_arraymysql_fetch_assoc函数来从结果集中获取数组?

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

$row['ownerContact.ContactFirstName']
Run Code Online (Sandbox Code Playgroud)

正如PHP-Docs所读:

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

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


这可能看起来像这样:

使用AS您的查询

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

SELECT something AS "something_else"
FROM your_table
Run Code Online (Sandbox Code Playgroud)

这会将-column 重命名somethingsomething_else(你可以保留""-quotes,但我认为它使它更具可读性).

使用数组的列索引

另一种方法是使用column-index而不是名字.看看这个查询:

SELECT first_name, last_name
FROM some_table
Run Code Online (Sandbox Code Playgroud)

结果集将包含两列,0 ==> first_name1 ==> last_name.您可以使用此数字访问结果集中的列:

$row[0] // would be the "first_name"-column
$row[1] // would be the "last_name"-column
Run Code Online (Sandbox Code Playgroud)

为了能够使用列索引,您需要使用mysql_fetch_row或者mysql_fetch_assoc-function,它提供关联数组,数字数组或两者("both"是标准的).