У меня есть две первичные таблицы 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
нет владельцаКонтакт вообще