2012-04-16 3 views
0

У меня есть база данных пользователей, у которых есть первичная таблица с именем, адресом и т. Д. Затем у меня есть отдельные таблицы для пользователей, домашних животных, учебных курсов и образовательных результатов и т. Д. .MySQL Выбор данных из нескольких разных таблиц в одном запросе

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

Мне действительно нужно знать, действительно ли это лучший способ сделать это, или есть ли способ сделать это с помощью одного запроса и если есть какое-то преимущество?

Основная структура таблиц:

+----------------+ +-----------------------+ 
| Users   | | Children    | 
+----------------+ +-----------------------+ 
|ID |Name |Age | |ID |UserRef |Name |Age | 
+----------------+ +-----------------------+ 
|1 |Jim |53 | |1 |1  |Joe |11 | 
|2 |Karl |37 | |2 |1  |Jane |9 | 
+----------------+ |3 |2  |Amy |15 | 
         +-----------------------+ 

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

Заранее спасибо.

+0

Уточните свой вопрос немного больше и поделитесь желаемым результатом. –

+0

Это действительно просто. Я предлагаю вам сначала записать, какие столбцы находятся под вопросом, и из какой таблицы они принадлежат. Затем запишите результаты того, что вы хотели бы, чтобы таблица конечных результатов выглядела. Знание входов и выходов позволяет вам сформировать и написать инструкцию SQL, которая даст желаемый результат.Сначала вам нужно точно знать, что вы хотите, чтобы SQL-запрос выполнял, прежде чем писать заявление, чтобы все работало так, как вы ожидали, до . . Проверьте мой ответ и дайте мне знать, как это происходит. – Pavan

ответ

0

Вы можете сделать простой ЛЕВЫЙ ПРИСОЕДИНЕНИЕ таблиц ON users.id = children.userref. Однако, поскольку это отношения «один-ко-многим», вам нужно использовать некоторую магию GROUP BY:

SELECT users. *, GROUP_CONCAT (children.id ORDER BY children.id ASC) AS childrens_ids, GROUP_CONCAT (дети. имя ORDER BY children.id ASC) AS childrens_names, GROUP_CONCAT (children.age ORDER BY children.id ASC) AS childrens_ages ОТ пользователей LEFT JOIN children ON users.id = children.userref GROUP BY children.userref

Вы бы затем необходимо использовать код для разбора/взорвания идентификаторов, имен и возрастов детей. Сказав все это, это не обязательно то, что вы ДОЛЖНЫ делать. Это не обязательно быстрее в конце MySQL, и вы видите, какую дополнительную работу вы должны выполнять в своем конце кода. Моя рекомендация - попробовать и посмотреть, как это влияет на вашу производительность.

+0

Я думаю, что это путь. Я дам ему попробовать и посмотреть, как это влияет на производительность. – Sean

0

Вот хороший запрос, чтобы начать с:

SELECT * FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef 

Обратите внимание, что это даст вам два значения, называемые «Name» - именно поэтому вы должны использовать псевдонимы:

SELECT Users.Name as ParentName, Children.Name as ChildName FROM Users RIGHT JOIN Children ON Users.ID = Children.UserRef 

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

Что касается того, является ли это лучше, чтобы использовать его, каждый метод имеет свои преимущества и недостатки. Когда вы создаете скрипт с более крупными и более продвинутыми запросами, которые делают то, что вы хотите (в отличие от многих небольших запросов), ваш скрипт будет работать быстрее, потому что вместо того, чтобы иметь 1 + (количество родителей) запросов, отправляющихся на сервер и обратно, будет только одним запросом. Однако плохо организованные запросы могут вызвать проблемы с отладкой позже, когда вы вернетесь к нему, и не помните, почему вы сделали это так, как сделали.

+0

Кто-нибудь хочет поделиться, почему это было приостановлено? Я думаю, что это был хороший ответ, и он охватил все базы. – tcole

+0

У другого пользователя был краткий комментарий, который проголосовал, поэтому я подозреваю, что это было возмездие. Спасибо за поддержку. – Tim

Смежные вопросы