2011-07-03 15 views
5

私は古くなっていますが、私が書く必要があるクエリはますます複雑になっています。次のクエリでは、ユーザーに関連付けられたすべてのtasksが取得されます。2つのSELECTクエリをマージする

"SELECT `date` 
    FROM `tasks` 
    WHERE `user_id`= 1;" 

tasks表である(iddateuser_idurl_id)。

"SELECT `t1`.`data` 
    FROM `tasks` `t1` 
    JOIN `urls` `u1` ON `u1`.`id` = `t1`.`url_id` 
    WHERE `u1`.user_id` = 1;" 

ものの、マージすることが可能です:

さて、私も取得する必要がありますが、ユーザーとのurl_id仲間が

`urls` table (`id`, `user_id`) 

トラフスタンドアロンのクエリは次のようになりますことを記録しますこれらの2つのクエリは1つのクエリに入りますか?私のロジックは、実際のJOINをどうやって行うのかわかりませんが、そうすべきだと言います。

+0

最後のクエリで 'data'または' date'を意味しましたか?また、URLテーブルからデータを選択していない場合は、実際に参加する必要がありますか? (その答えは "はい、そのユーザーIDのURLエントリがあることを確認する"ことができます。)そしてなぜそんなに多くのバックティック;それはMS SQL Serverと角括弧のように悪いです! –

+0

途中で質問を書いたので、間違いがほとんどありませんでした。あなたは正しいですが、それは「データ」ではなく「日付」でなければなりませんでした。私は通常、あなたが非常に高い評判を持っていますが、「back-ticks」についての発言を無視していたので、「MS SQL Serverと角かっこのように悪い」と言っているのかなんて不思議です。バッククッキーの目的は、MySQLサーバがテーブルとカラムの名前を素早く識別できるようにすること、ネストされたセットで 'left'や' right'のような予約されたキーワードを使うときの混乱を避けることです。 – Gajus

+0

MS SQL Serverユーザーが角括弧を使用するのと同じ主張がなされています。それは私には醜いとそれは完全に非標準です。他のDBMSは、標準が「二重引用符で囲まれている」と言われる「区切られた識別子」を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

重複を削除したくない場合は、 'UNION ALL'が必要です。 – tvanfosson

+0

それは変です。私は私の人生の前にUNIONを使ったことは一度もありませんでした。これは過去2日間で3回目です。 :)でも、ありがとう! – Gajus

+0

@Guy - あなたは歓迎ですが、私はなぜアップフォートがないのだろうか? :-( – 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は悪名高い悪いパフォーマーである - それは、実行計画を破片。クエリを分割し、結果セットを結合するには、演算子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オペレータ知っているので、あなたのデータを知っています。

関連する問題