Mysql 合并两个SELECT查询
我不是变老了,就是我需要写的查询越来越复杂了。以下查询将获取与用户关联的所有任务Mysql 合并两个SELECT查询,mysql,sql,Mysql,Sql,我不是变老了,就是我需要写的查询越来越复杂了。以下查询将获取与用户关联的所有任务 "SELECT `date` FROM `tasks` WHERE `user_id`= 1;" 任务表为id、日期、用户id、url id 现在,我还需要获取url_id通过 `urls` table (`id`, `user_id`) 独立查询如下所示: "SELECT `t1`.`data` FROM `tasks` `t1` JOIN `urls` `u1` ON `u1`
"SELECT `date`
FROM `tasks`
WHERE `user_id`= 1;"
任务表为id、日期、用户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;"
但是,是否可以将这两个查询合并为一个查询?我的逻辑是这样的,尽管我不知道如何进行实际的连接。我可能会使用一个
您可以在单个查询中执行此操作:
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运算符最适合您的需要。注意,如果您不想删除重复项,您将需要UNION ALL。这很奇怪。我一生中从未使用过UNION,这是过去两天来的第三次不过,谢谢你!当时我还不能选择它作为答案,@tvanfosson。你上次查询的是数据还是日期?另外,如果您没有从URL表中选择任何数据,那么您真的需要加入它吗?答案可能是肯定的,以确保该用户ID有一个URL条目。以及为什么有这么多的倒勾;它和MS SQL Server和方括号一样糟糕!我已经在途中写了这个查询,所以我自然没有留下什么错误。你是对的,它必须是日期而不是数据。我通常会忽略一句关于背虱的评论,尽管你有很高的声誉,所以我有点好奇你为什么说它和MS SQL Server和方括号一样糟糕?backticks本身的目的是确保MySQL server能够快速识别表名和列名,并避免在使用保留关键字(如嵌套集中的left或right)时出现混淆。MS SQL server用户对方括号也提出了同样的要求。我觉得它很难看,而且完全不标准。没有其他DBMS支持SQL标准所称的“分隔标识符”的反勾号或方括号,该标准称这些标识符用双引号括起来;单引号是为字符串保留的。不同的数据库管理系统对关键字的使用有不同的规则。我使用的方法主要允许在许多地方使用关键字作为标识符。最好通过避免关键字作为标识符来避免引用……继续……不过,我认为你应该纠正这个问题。人们不会总是阅读评论,也不应该阅读评论来理解问题。
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)