Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 合并两个SELECT查询_Mysql_Sql - Fatal编程技术网

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)