合并两个SELECT查询

时间:2011-07-03 14:02:36

标签: mysql sql

我要么变老了,要么我需要写的查询变得越来越复杂。以下查询将获取与该用户关联的所有tasks

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

tasks表格为(iddateuser_idurl_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;"

但是,是否可以将这两个查询合并为一个查询?我的逻辑说它应该是,虽然我不知道如何做实际的JOIN。

2 个答案:

答案 0 :(得分:6)

我可能会使用UNION

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 :(得分:1)

您可以在一个查询中执行此操作:

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是一个出了名的糟糕表现者 - 它会破坏执行计划。拆分查询,可以使用UNIONUNION 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运营商最符合您的需求。