我要么变老了,要么我需要写的查询变得越来越复杂。以下查询将获取与该用户关联的所有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;"
但是,是否可以将这两个查询合并为一个查询?我的逻辑说它应该是,虽然我不知道如何做实际的JOIN。
答案 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
是一个出了名的糟糕表现者 - 它会破坏执行计划。拆分查询,可以使用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
运营商最符合您的需求。