2011-07-03 179 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運營商最符合您的需求。