объединение двух запросов SELECT - PullRequest
5 голосов
/ 03 июля 2011

Я либо старею, либо запросы, которые мне нужно написать, становятся все более и более сложными.Следующий запрос получит все tasks, связанные с пользователем.

"SELECT `date` 
   FROM `tasks` 
  WHERE `user_id`= 1;"

Таблица tasks (id, date, user_id, url_id);

Теперь мне нужно также получить записи, которые url_id ассоциируется с пользователем через

`urls` table (`id`, `user_id`)

Автономный запрос будет выглядеть так:

"SELECT `t1`.`data` 
   FROM `tasks` `t1` 
   JOIN `urls` `u1` ON `u1`.`id` = `t1`.`url_id` 
  WHERE `u1`.user_id` = 1;"

ХотяМожно ли объединить эти два запроса в один запрос?Моя логика гласит, что так и должно быть, хотя я не понимаю, как на самом деле присоединиться.

Ответы [ 2 ]

6 голосов
/ 03 июля 2011

Я бы, наверное, использовал СОЮЗ .

SELECT `date`
   FROM `tasks` WHERE `user_id`=1
UNION
SELECT `t1`.`date`
   FROM `tasks` `t1`
   INNER JOIN `urls` `u1` ON `u1`.`id` = `t1`.`url_id`
   WHERE `u1`.user_id`=1;
1 голос
/ 03 июля 2011

Вы можете сделать это одним запросом:

SELECT t.date
  FROM TASKS t
 WHERE t.user_id = 1
    OR EXISTS(SELECT NULL
                FROM URLS u
               WHERE u.id = t.url_id
                 AND u.user_id = 1)

Однако, OR печально известен плохим исполнителем - он нарушает план исполнения. Разделение запроса, объединение результирующих наборов может быть выполнено с помощью операторов UNION или UNION ALL. UNION удаляет дубликаты из окончательного набора результатов; UNION ALL не удаляет дубликаты и работает быстрее.

SELECT t.date
  FROM TASKS t
 WHERE t.user_id = 1
UNION ALL
SELECT t.date
  FROM TASKS t
 WHERE EXISTS(SELECT NULL
                FROM URLS u
               WHERE u.id = t.url_id
                 AND u.user_id = 1)

Знайте свои данные, чтобы вы знали, какой оператор UNION лучше всего отвечает вашим потребностям.

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