#php #mysql #join
#php #mysql #Присоединиться
Вопрос:
Хорошо, я постараюсь придать этому смысл, лол. В принципе, у меня есть 4 разные таблицы, к которым я пытаюсь присоединиться, вместо того, чтобы выполнять несколько отдельных инструкций SQL, поскольку движок MYSQL должен быть способен оптимизировать это лучше, чем я мог.
В принципе, у меня есть эти 4 таблицы:
projects (key:id)
project_users (key:project_id , user_id)
users (key:id)
tasks (key:project_id)
Это мой запрос:
SELECT projects.*, users.*, tasks.*,
FROM
projects JOIN ( project_users JOIN
users ON
project_users.user = users.id )
ON projects.id = project_users.project_id
JOIN ( tasks )
ON projects.id = tasks.project_id
WHERE projects.company = 2 ORDER BY projects.id
По сути, я пытаюсь получить список проектов, пользователей в этом проекте и задач в этом проекте для определенной компании.
ПРОБЛЕМА — если в этом проекте нет задачи, он не возвращает этот проект. Который мне все еще нужен в этом проекте, только с 0 задачами для этого проекта.
Я новичок в операторах объединения, поэтому, если я могу что-то улучшить, ПОЖАЛУЙСТА, дайте мне знать!
СПАСИБО ЗА ВАШЕ ВРЕМЯ И ПОМОЩЬ!!!!!
Комментарии:
1. Эхх… Я не помешан на SQL, но моей первоначальной мыслью было, что если вам нужен список проектов и список задач, то на самом деле это два запроса…
2. Ну, они оба сопоставимы по значению ключа. Это означает, что вместо получения проектов, а затем списка задач в этих проектах, я хочу выполнить 1 оператор, чтобы это было намного быстрее.
3. Вы имеете в виду, что в PHP вы собираетесь собирать список проектов по мере повторения результата запроса?
4. Я согласен, разделение работы было бы лучше, поскольку структура базы данных предполагает, что пользователи независимы от задач, и смешивание этих двух в одном запросе может привести к некоторым побочным эффектам.
Ответ №1:
Все, что вам нужно сделать, это добавить left outer
перед соединением, которое объединяет задачи. Это даст вам проекты, даже если нет задач.
Ответ №2:
левые или правые соединения — ваши новые друзья
http://dev.mysql.com/doc/refman/5.0/en/left-join-optimization.html