1

2つのプライマリ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_arrayまたは-関数を使用していると思いますか?mysql_fetch_assoc

この場合、使用できません

$row['ownerContact.ContactFirstName']

PHP-Docsが読んだように:

結果の2つ以上の列が同じフィールド名を持つ場合、最後の列が優先されます。同じ名前の他の列にアクセスするには、列の数値インデックスを使用するか、列のエイリアスを作成する必要があります。エイリアス列の場合、元の列名のコンテンツにアクセスすることはできません。

したがって、ASSQLクエリでを使用して2倍の行に他の名前を設定するか、番号付きインデックスを使用してそれらにアクセスできます。


これは次のようになります。

ASクエリでの使用

標準のSQLクエリでは、結果セットの列は、値の元の列と同じように名前が付けられます。場合によっては、名前の競合が原因でこれが問題になることがあります。ASクエリで-コマンドを使用すると、結果セットの列の名前を変更できます。

SELECT something AS "something_else"
FROM your_table

これにより、something-columnの名前がに変更されsomething_elseます(-quotesは省略できますが、""読みやすくなると思います)。

配列の列インデックスの使用

もう1つの方法は、名前の代わりにcolumn-indexを使用することです。このクエリを見てください:

SELECT first_name, last_name
FROM some_table

結果セットには、2つの列とが含まれ0 ==> first_nameます1 ==> last_name。この番号を使用して、結果セットの列にアクセスできます。

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

column-indexを使用できるようにするには、mysql_fetch_rowまたはmysql_fetch_assoc-functionを使用する必要があります。これは、連想配列、数値配列、またはその両方を提供します(「両方」が標準です)。

于 2011-08-04T00:58:19.247 に答える
2

*を必要なデータに置き換える必要があり、同様のエイリアスを作成する必要があります:ownerContact.ContactFirstName asowner_ContactFirstNameおよびbreederContact.ContactFirstNameasbreeder_ContactFirstName。

このような :

プロファイルからowner_ContactFirstNameとしてownerContact.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を使用して行にアクセスする場合、テーブルエイリアスを指定することはできません。$row['ContactFirstName']同じ名前のフィールドが2つない場合は、でアクセスできます。この場合ContactFirstName、2番目に表示されるものはすべて最初のものを上書きします。

フィールドエイリアスを使用するようにクエリを変更して、実行できるようにします$owner = $row['Owner_ContactFirstName']
100%確信が持てない別のオプションは、名前ではなくインデックスでフィールドにアクセスすることです(例$owner=$row[11])。それが機能したとしても、そうすることはお勧めしませんが、クエリを少し変更すると多くの問題が発生します。

于 2011-08-04T00:56:31.913 に答える
0

外側の選択では、テーブルは2つだけです。

(inner select) as ilv
contacts as breederContact

ownerContactはまったくありません

于 2011-08-04T00:52:13.220 に答える