1

我有两个主要的 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

再加上以下 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']);

非常感谢大家!

4

4 回答 4

5

我猜你正在使用mysql_fetch_arrayor mysql_fetch_assoc-functions 从结果集中获取数组?

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

$row['ownerContact.ContactFirstName']

正如PHP-Docs 所读

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

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


这可能看起来像这样:

AS在您的查询中使用

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

SELECT something AS "something_else"
FROM your_table

这会将 -column 重命名somethingsomething_else(您可以将""-quotes 省略,但我认为它使其更具可读性)。

使用数组的列索引

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

SELECT first_name, last_name
FROM some_table

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

$row[0] // would be the "first_name"-column
$row[1] // would be the "last_name"-column

为了能够使用列索引,您需要使用mysql_fetch_rowmysql_fetch_assoc- 函数,它提供关联数组、数值数组或两者(“两者”是标准的)。

于 2011-08-04T00:58:19.247 回答
2

您需要将 * 替换为您需要的数据,并且您还必须制作别名: ownerContact.ContactFirstName 为 owner_ContactFirstName ,breederContact.ContactFirstName 为breeder_ContactFirstName 。

像这样 :

从配置文件中选择 ownerContact.ContactFirstName 作为 owner_ContactFirstName ,breederContact.ContactFirstName 作为breeder_ContactFirstName 加入ownerContact ...等

这样你会写:

$owner = ($row['owner_ContactFirstName'] . ' ' . $row['owner_ContactLastName']);
$breeder = ($row['breeder_ContactFirstName'] . ' ' . $row['breeder_ContactLastName']);
于 2011-08-04T00:52:25.560 回答
1

使用 php.ini 访问行时不能指定表别名。$row['ContactFirstName']如果您没有 2 个具有相同名称的字段,则访问它会起作用。在这种情况下ContactFirstName,第二个出现的任何内容都会覆盖第一个。

更改您的查询以使用字段别名,这样您就可以执行$owner = $row['Owner_ContactFirstName'].
我不确定100%的另一个选择是按索引访问字段,而不是按名称(例如$owner=$row[11])。即使它有效,我也不建议这样做,如果稍微更改一下查询,您将遇到很多麻烦。

于 2011-08-04T00:56:31.913 回答
0

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

(inner select) as ilv
contacts as breederContact

根本没有 ownerContact

于 2011-08-04T00:52:13.220 回答