2011-07-03 254 views
5

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

"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。

+0

在上次查询中,你的意思是“数据”或“日期”吗?另外,如果您没有从URL表中选择任何数据,您是否真的需要加入它? (答案可能是“是的,以确保有该用户标识的URL条目”。)以及为什么有这么多的反标记;它与MS SQL Server和方括号一样糟糕! –

+0

我在路上写了查询,所以我自然留下了一些错误。你是对的,它必须是'日期'而不是'数据'。我通常会忽略关于“back-ticks”的评论,尽管你有很高的声誉,所以我有点好奇你为什么说“它和MS SQL Server和方括号一样糟糕”?反引号的目的本身就是为了确保MySQL服务器能够快速识别表名和列名,并避免在使用保留关键字(例如嵌套集合中的“left”或“right”)时发生混淆。 – Gajus

+0

MS SQL Server用户对方括号做出了相同的说明。它看起来很丑,而且完全没有标准。没有其他数据库管理系统支持SQL标准所称的“分隔标识符”的反标记或方括号,标准中所使用的标识符是用双引号括起来的;单引号是为字符串保留的。不同的DBMS对于可以使用关键字的地方有不同的规则。我使用的主要功能是在许多地方使用关键字作为标识符。避免使用关键字作为标识符最好避免使用引号。 –

回答

5

我可能会使用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; 
+0

请注意,如果您不想删除重复项,您将需要'联合全部'。 – tvanfosson

+0

这很奇怪。我以前从未使用UNION,这是过去两天的第三次。 :)虽然,谢谢! – Gajus

+0

@Guy - 不客气,但我想知道为什么没有upvote? :-( – tvanfosson

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运营商最符合您的需求。