Как вывести результаты запроса MySQL, который использовал псевдонимы? - PullRequest
0 голосов
/ 04 августа 2011

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

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

Я получил большую помощь здесь по другому вопросу, касающемуся объединений и псевдонимов, где мне также был предложен следующий запрос. К сожалению, я испытываю огромные трудности с отображением результатов. Каждый сайт, который имеет дело с Self Joins и 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 пусты.

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

РЕДАКТИРОВАТЬ: Мой последний РАБОЧИЙ запрос:

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 ]

5 голосов
/ 04 августа 2011

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

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

$row['ownerContact.ContactFirstName']

при чтении PHP-документации :

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

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


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

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

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

SELECT something AS "something_else"
FROM your_table

Это переименует something -колонну в something_else (вы можете оставить "" - кавычки, но я думаю, что это делает его более читабельным).

Использование индексов столбцов для массива

Другой способ - использовать индекс столбцов вместо ихимена.Посмотрите на этот запрос:

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

2 голосов
/ 04 августа 2011

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

вот так:

выберите ownerContact.ContactFirstName в качестве owner_ContactFirstName, breederContact.ContactFirstName в качестве breeder_ContactFirstName из профилей, присоединитесь к ownerContact ... etc

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

$owner = ($row['owner_ContactFirstName'] . ' ' . $row['owner_ContactLastName']);
$breeder = ($row['breeder_ContactFirstName'] . ' ' . $row['breeder_ContactLastName']);
1 голос
/ 04 августа 2011

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

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

0 голосов
/ 04 августа 2011

При внешнем выборе. У вас есть только две таблицы:

(inner select) as ilv
contacts as breederContact

владельца нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...