Как выводить результаты запроса MySQL, в котором используются псевдонимы?

У меня есть две первичные таблицы MySQL (профили и контакты) со многими дополнительными таблицами (с префиксом prm_). К ним обращаются и управляются через PHP.

В этом случае я запрашиваю таблицу профилей, где я получу идентификатор владельца и идентификатор селекционера. Затем будет ссылаться на таблицу контактов, где хранится информация о владельцах и селекционерах.

Я получил большую помощь здесь по другому вопросу относительно объединений и псевдонимов, где мне также был предоставлен следующий запрос. К сожалению, я испытываю огромные трудности, фактически повторяя результаты. Каждый сайт, посвященный Self Joins and Aliases, предоставляет прекрасные примеры запросов, но затем переходите к «и этим выводам и т. Д. И т. Д.». Как это выводится ????

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 пусты.

Любая помощь в разрешении этого для меня будет оценена по весу .

EDIT: Мой последний запрос WORKING:

 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']); 

Большое спасибо всем!

Думаю, вы используете mysql_fetch_array или mysql_fetch_assoc -функции, чтобы получить массив из набора результатов?

В этом случае вы не можете использовать

 $row['ownerContact.ContactFirstName'] 

как читают PHP-Docs :

Если два или более столбца результата имеют одинаковые имена полей, последний столбец будет иметь приоритет. Чтобы получить доступ к другим столбцам (именам) с тем же именем, вы должны использовать числовой индекс столбца или сделать псевдоним для столбца. Для столбцов с псевдонимом вы не можете получить доступ к содержимому с исходным именем столбца.

Таким образом, вы можете использовать AS в своем SQL-запросе для установки других имен для удвоенных строк или использования нумерованных индексов для их доступа.


Тогда это может выглядеть так:

Использование AS в вашем запросе

В стандартном SQL-запросе столбцы в наборе результатов называются столбцами, из которых берутся их значения. Иногда это может быть проблемой из-за конфликта имен. Используя команду AS в запросе, вы можете переименовать столбец в результирующем наборе:

 SELECT something AS "something_else" FROM your_table 

Это переименует что- something -column в something_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_row или mysql_fetch_assoc , которая предлагает ассоциативный массив, числовой массив или оба (оба являются стандартными).

вам нужно заменить * данными, которые вам нужны, и аналогичными вам также нужно сделать псевдонимы: ownerContact.ContactFirstName как owner_ContactFirstName и breederContact.ContactFirstName как breeder_ContactFirstName.

как это :

выберите ownerContact.ContactFirstName как owner_ContactFirstName, breederContact.ContactFirstName как breeder_ContactFirstName из профилей join ownerContact … и т. д.

таким образом вы напишете:

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

Вы не можете указать псевдоним таблицы при доступе к строке с помощью php. Доступ к нему по $row['ContactFirstName'] будет работать, если у вас не было двух полей с тем же именем. В этом случае независимо от ContactFirstName , что второе имя ContactFirstName перезаписывает первое.

Измените свой запрос, чтобы использовать псевдонимы полей, поэтому вы можете сделать $owner = $row['Owner_ContactFirstName'] .
Другой вариант: я не уверен на 100% – это доступ к полю по индексу, а не по имени (например, $owner=$row[11] ). Даже если это работает, я не рекомендую это делать, у вас будет много проблем, если вы немного измените свой запрос.

On external select У вас есть только две таблицы:

 (inner select) as ilv contacts as breederContact 

нет владельцаКонтакт вообще