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 | ----------------- ---------
-----------
しかし、私は雄弁に変換トラブルを抱えているように見えます。問題はサブクエリにあるように見えます(私はwhereDoesntHave
とwhereNotExists
を試しましたが、どちらも問題ありません)。
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 *)
理解すべてのヘルプ。
を細工!これは完全に機能します(whereColumnsには小さな間違いがありますが、子供の代わりに自分自身と比較しています)。 – DGeo
@DGeoが更新されました。私はあなたの質問の答えを質問に基づいています。それに気付かなかった。 – Sandeesh
ああ、私はちょうど今、私の悪いことを発見した。再度、感謝します。 – DGeo