2017-05-26 13 views
1

Iいる(ユーザが割り当てられているために、この最上位のノード、すなわち、ユーザに対して)、ネストされたテーブルからルートノードをプル以下のSQLは、雄弁whereNotExists正しく

SELECT 
    child_domain.*, child_subscription.user_id 
FROM 
    domains AS child_domain 
JOIN subscriptions 
    AS child_subscription 
    ON child_subscription.domain_id = child_domain.id 
WHERE NOT EXISTS 
    (
     SELECT 1 
     FROM domains AS parent_domain 
     JOIN subscriptions 
      AS parent_subscription 
      ON parent_subscription.domain_id = parent_domain.id 
     WHERE 
      parent_domain.start < child_domain.start 
     AND 
      parent_domain.end > child_domain.end 
     AND 
      parent_subscription.user_id = child_subscription.user_id 
    ); 

上記リターンを生成しませんネストされた行のルートノード、テーブルはこのような何か、

----------- ----------------- --------- 
| DOMAINS | | SUBSCRIPTIONS | | USERS | 
----------- ----------------- --------- 
| id  | | user_id  | | id | 
| start | | domains_id | | name | 
| end  | ----------------- --------- 
----------- 

しかし、私は雄弁に変換トラブルを抱えているように見えます。問題はサブクエリにあるように見えます(私はwhereDoesntHavewhereNotExistsを試しましたが、どちらも問題ありません)。

DB::table('domains as child_domain') 
    ->join('subscriptions as child_subscription','child_subscription.domain_id','child_domain.id') 
    ->whereNotExists('domains as parent_domain',function($query){ 
     $query 
     ->join('subscriptions as parent_subscription','parent_subscription.domain_id','parent_domain.id') 
     ->where('parent_domain.end','>','parent_domain.end') 
     ->where('parent_domain.start'.'<','parent_domain.start') 
     ->where('parent_subscription.user_id', 'child_subscription.user_id')->get(); 
}); 

上記のコード、I出力toSql()示し、

select * from `domains` as `child_domain` inner join `subscriptions` as `child_subscription` on `child_subscription`.`domain_id` = `child_domain`.`id` where not exists (select *) 

理解すべてのヘルプ。

答えて

0

あなたが望むものをテストし、正確に生成します。

DB::table('domains as child_domain') 
    ->join('subscriptions as child_subscription', 'child_subscription.domain_id', 'child_domain.id') 
    ->whereNotExists(function($query) { 
     $query->selectRaw(1) 
      ->from('domains as parent_domain') 
      ->join('subscriptions as parent_subscription', 'parent_subscription.domain_id', 'parent_domain.id') 
      ->whereColumn('parent_domain.start', '<', 'child_domain.start') 
      ->whereColumn('parent_domain.end', '>', 'child_domain.end') 
      ->whereColumn('parent_subscription.user_id', 'child_subscription.user_id'); 
    }) 
    ->select('child_domain.*', 'child_subscription.user_id') 
    ->get(); 

問合せありがとう

select `child_domain`.*, `child_subscription`.`user_id` from `domains` as `child_domain` inner join `subscriptions` as `child_subscription` on `child_subscription`.`domain_id` = `child_domain`.`id` where not exists (select 1 from `domains` as `parent_domain` inner join `subscriptions` as `parent_subscription` on `parent_subscription`.`domain_id` = `parent_domain`.`id` where `parent_domain`.`start` < `child_domain`.`start` and `parent_domain`.`end` > `child_domain`.`end` and `parent_subscription`.`user_id` = `child_subscription`.`user_id`) 
+0

を細工!これは完全に機能します(whereColumnsには小さな間違いがありますが、子供の代わりに自分自身と比較しています)。 – DGeo

+0

@DGeoが更新されました。私はあなたの質問の答えを質問に基づいています。それに気付かなかった。 – Sandeesh

+0

ああ、私はちょうど今、私の悪いことを発見した。再度、感謝します。 – DGeo