Оператор соединения MYSQL — необязательные таблицы?

#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