2016-12-08 14 views
1

私は次のように2つのテーブルを持っています:Laravel Mysqlクエリ条件で選択

1)。 URLの

id domain    created_at 
------------------------------------------------ 
    1  google.com   2016-11-30 00:00:00 
    2  test.com    2016-11-29 00:00:00 
    3  example.com  2016-11-26 00:00:00 

など。 2)。リンク

 id urls_id end_date    created_at   status 
--------------------------------------------------------------------------- 
    1  2  2016-11-30 00:00:00 2016-11-30 00:00:00  Approved 
    2  2  2016-12-01 00:00:00 2016-11-30 00:00:00  Approved 
    3  2  NULL     2016-11-30 00:00:00  Approved 
    4  2  2017-01-01 00:00:00 2016-12-01 00:00:00  Approved 
    5  2  2016-01-01 00:00:00 2016-12-01 00:00:00  Pending 
    6  3  2016-11-24 00:00:00 2016-12-01 00:00:00  Pending 
    7  3  2016-01-01 00:00:00 2016-12-01 00:00:00  Approved 
    8  3  NUll     2016-12-02 00:00:00  Pending 
    9  3  2016-01-08 00:00:00 2016-12-01 00:00:00  Approved 
    10 3  NUll     2016-12-02 00:00:00  Pending 

私は、これらの条件に戻すためにMYSQLクエリを記述したいと思います:これらの条件を以下のドメインあたり 1行:

1). end_date NOT NULL AND 
2). end_date > Carbon::now() (I am using carbon) not expired AND 
3). status is "Approved" AND 
4). return latest end_date closer to present or now. 

例えば、それが見えるとありますので、すべての "urls_id" = 2を選択し、すべてのステータスを承認とし、end_dateがNULLでなく期限切れではないことを探しますが、1つのNullがあるので返さないで、 "urls_id" = 3に移動し、有効期限が切れていて、NULLがないか期限切れになっていないので、遅いここ

番目のEND_DATE

は出力

id  domain   end_date_max   
    ------------------------------ 
    9  example.com  2016-01-08 00:00:00 

で、我々は1つのSQLクエリでこれを行うことができますか?あなたはこのような生のクエリせずにこれを行うことができますので、Laravelにあるいは単なる生のクエリ

おかげ

答えて

0

Laravelは非常に良いのActive Recordクラスを提供しています。このような

$result = DB::table('urls') 
      ->leftJoin('links', 'urls.id', '=', 'links.urls_id') 
      ->whereNotNull('links.end_date') 
      ->where('links.end_date','>', Carbon::now()) 
      ->where('links.status','Approved') 
      ->orderBy('links.end_date','DESC') 
      ->groupBy('urls.domain') 
      ->get(); 

何かがトリックを行う必要があります私はコードをテストしなかったので、うまくいきたいと思っています。

+0

これはtest.comを返しています。私はexample.comを返そうとしています。これは条件を満たしている最初のものをすべてチェックしていますので、戻り値test.comはid = 1です。私は最初にすべてのステータスを取得する必要があります= "承認"少なくとも1つがend_date NULLまたはend_date期限が切れていないかどうかを確認しないでくださいそのドメイン全体を得る、あなたは私のポイントを参照してください – user3150060

+0

他のヘルプ? – user3150060

+0

この場合、テーブルを元に戻すようにしてください。ただし、MySQLに関する知識がなければ、複雑なクエリを実行する前に書籍を読むべきでしょう。 MySQLコード内のテーブルの例を逆転: "SELECT t2.id、t2.domain、t1.end_date FR1リンクt1 LEFT JOIN url t2 on t2.id = t1.urls_id WHERE t1.end_date IS NOT NULLおよびt1.end_date> "YOUR_CARBON_DATE_HERE"およびt1.status = '承認済み' GROUP BY t1.end_date ORDER BY t1.end_date DESC "。 –