У меня есть база данных с таблицей для сведений о пони, другая для сведений о контактах (владельцы и заводчики), а затем несколько других небольших таблиц для параметров (цвета, округа, коды городов и т. Д.). Чтобы дать мне список существующих профилей пони с указанием их различных деталей, я использую следующий запрос:
SELECT *
FROM profiles
INNER JOIN prm_breedgender
ON profiles.ProfileGenderID = prm_breedgender.BreedGenderID
LEFT JOIN contacts
ON profiles.ProfileOwnerID = contacts.ContactID
INNER JOIN prm_breedcolour
ON profiles.ProfileAdultColourID = prm_breedcolour.BreedColourID
ORDER BY profiles.ProfileYearOfBirth ASC $limit
В приведенном выше примере таблица «анкеты» - это моя основная таблица (содержащая информацию о пони), «контакты» занимают второе место по важности, как и информация о владельце и заводчике. Меньшие таблицы параметров могут быть идентифицированы по их префиксу prm_. Приведенный выше запрос работает нормально, но я хочу сделать больше.
Первая большая проблема заключается в том, что я хочу группировать результаты по полу: жеребцы, кобылы, мерины ... Я использовал << GROUP BY prm_breedgender.BreedGender >> или << GROUP BY ProfileBreedGenderID >> перед моей строкой ORDER BY , но затем возвращает только два результата из всех моих доступных профилей. Я прочитал об этом, и, очевидно, мне нужно реорганизовать мой запрос, чтобы включить GROUP в мое основное предложение SELECT. Как это сделать, однако, меня смущает verrrrrrry. Пошаговая помощь здесь будет потрясающей.
Как еще одно замечание по поводу вышеизложенного - вы, возможно, заметили переменную $ limit в конце моего запроса. Это для нумерации страниц, особенность, которую я хочу сохранить. Однако я не должен думать, что это проблема.
Моя вторичная проблема - скорее организационная. Вы можете увидеть, где я вытащил информацию о своем владельце из таблицы контактов здесь:
LEFT JOIN contacts
ON profiles.ProfileOwnerID = contacts.ContactID
Я мог бы добавить еще одно условие:
AND profiles.ProfileBreederID = contacts.ContactID
с намерением указать владельца и заводчика пони, где доступна информация о любом из них. Я не уверен, как отобразить эту информацию, так как $ row ['ContactName'] может применяться в качестве владельца или заводчика.
Это случай простого запуска двух запросов, а не одного? Назначить переменную $ foo для первого запуска запроса, а затем просто выполнить еще один отдельный запрос и присвоить $ bar этим результатам? Или есть более разумный способ сделать все это в одном запросе (например, $ row ['ContactName'] Первая итерация, $ row ['ContactName'] Вторая итерация)? Совет здесь будет высоко ценится.
И это все! Я старался быть максимально ясным и очень ценю любую помощь или совет, который вы можете дать. Заранее спасибо.
################################################## ########################РЕДАКТИРОВАТЬ
Мой запрос в настоящее время представляет собой объединение запросов, предоставленных Cularis и Symcbean:
SELECT *
FROM (
profiles
INNER JOIN prm_breedgender
ON profiles.ProfileGenderID = prm_breedgender.BreedGenderID
LEFT JOIN contacts AS owners
ON profiles.ProfileOwnerID = owners.ContactID
INNER JOIN prm_breedcolour
ON profiles.ProfileAdultColourID = prm_breedcolour.BreedColourID
)
LEFT JOIN contacts AS breeders
ON profiles.ProfileBreederID = breeders.ContactID
ORDER BY prm_breedgender.BreedGender ASC, profiles.ProfileYearOfBirth ASC $limit
Это работает, поскольку результаты упорядочены так, как я надеялся: то есть по возрасту и полу. Тем не менее, я не могу заставить псевдоним работать в отношении запросов контактов (заводчик и владелец). Никаких ошибок не отображается, а также нет владельцев или заводчиков. Любые дальнейшие разъяснения по этому поводу будут очень благодарны.
P.s. Я удалил псевдоним, предоставленный последнему LEFT JOIN по примеру Symcbean, так как я не мог заставить результирующий оператор ORDER BY работать на меня - я уверен, что это моя вина. Тем не менее, это работает сейчас, хотя это может быть причиной проблемы с запросом контактов.