2016-07-07 8 views
0

このクエリは正当な構文ではなく、効率的な書き込み方法を理解しようとしています。これは私が持っているものです:派生カラムと複数の結合を使用するMySQLクエリを作成する適切な方法

SELECT a.*, b.id, lapsed FROM 
    (SELECT DATEDIFF(CURDATE(), MAX(day)) AS lapsed FROM c) AS x 
    FROM first_table a 
    INNER JOIN second_table b ON a.id = b.some_id 
    INNER JOIN third_table c ON c.user_id = a.user_id 
    WHERE a.some_col = 'm' 
    AND b.num >= lapsed 

3つのテーブルが結合されています。通常これは簡単なことですが、問題はWHERE節の最後の部分です。具体的には、b.num >= lapsedderivedという値で比較しています。これを書く正しい方法はありますか?

+0

2 FROMは許可されません。しかし、サブクエリのLEFT JOINは可能です。 xの1行なので、結合ON条件は(1 = 1)になります。 – LukStorms

+0

私はそれに応じてマークすることができますので、あなたは答えとしてクエリを提出することができます? – randombits

+0

あなたと私は、あなたの質問にどこに問題があるかについて、さまざまなアイデアを持っています。 – Strawberry

答えて

0

あなたはthird_tableから各user_id値の最新のday値をしたいのように、それが見えます。それを得るために、我々はこのようなクエリを書くことができます

SELECT c.user_id 
     , DATEDIFF(CURDATE(),MAX(c.day)) AS lapsed 
    FROM third_table c 
    GROUP BY c.user_id 

あなたはAの代わりにインライン・ビューとしてそのクエリを使用して、別のクエリで値集合ソースとしてこのクエリからの結果セットを使用することができますテーブル参照。 (MySQLはインラインビューを「派生テーブル」と呼んでいます)。

括弧内にそのクエリをラップし、通常はテーブル参照を見つける場所の代わりに使用します。インラインビュー(派生テーブル)にはエイリアスを割り当てる必要があります。例えば

:それに類似したクエリを実行する必要があり

SELECT a.* 
     , b.id 
     , d.lapsed 
    FROM first_table a 
    JOIN second_table b 
    ON b.some_id = a.id 
    JOIN (SELECT c.user_id 
       , DATEDIFF(CURDATE(),MAX(c.day)) AS lapsed 
      FROM third_table c 
      GROUP BY c.user_id 
     ) d 
    ON d.user_id = a.user_id 
    WHERE a.some_col = 'm' 
    AND b.num > d.lapsed 

。しかし、それがあなたが達成しようとしている結果セットを返すかどうかは、本当にあなたが返そうとしている結果に依存します。指定がないと(無効なクエリ構文とは別に)、われわれはちょうど推測している。

1

これをテストしていませんが、サブクエリが正しい場合はこれが機能するはずです。

また、質問の例の「c」は、そのthird_tableを参照していて、cという名前のテーブル/ビューも参照していないとも仮定しました。

INNER JOINからthird_tableへのコメントアウトは、INNER JOINテーブル/ビューがフィールドを使用しないときはほとんど役に立たないため、コメントアウトされました。それは、そのテーブルにあるレコードを制限するために使用できますが、ほとんどの場合、それを行うのは無駄です。 MAX()集約を考えると

SELECT a.*, b.id, x.lapsed 
FROM first_table a 
INNER JOIN second_table b ON a.id = b.some_id 
--INNER JOIN third_table c ON c.user_id = a.user_id 
LEFT JOIN ( 
    SELECT DATEDIFF(CURDATE(), MAX(day)) AS lapsed 
    FROM third_table 
) AS x ON (1=1) 
WHERE a.some_col = 'm' 
AND b.num >= x.lapsed; 
関連する問題