2017-04-25 1 views
0

私は複雑なクエリを作成するのに少し助けが必要ですが、私は以下で達成しようとしていることを説明しようとします。私が持っている:ここでは単一のクエリへの複雑なループのループ

は私のデータ

table_one

+---------+---------+----------+----------+ 
| user_id | poly_id | in | out | 
+---------+---------+----------+----------+ 
|  900 |  1 | 20-12-17 | 20-12-17 | 
|  900 |  2 | 21-12-17 | 22-12-17 | 
|  900 |  3 | 22-12-17 | 24-12-17 | 
|  900 |  1 | 23-12-17 | 26-12-17 | 
|  444 |  4 | 24-12-17 | 28-12-17 | 
|  444 |  4 | 25-12-17 | 30-12-17 | 
|  444 |  5 | 26-12-17 | 01-01-18 | 
|  444 |  3 | 27-12-17 | 03-01-18 | 
|  900 |  2 | 28-12-17 | 05-01-18 | 
|  900 |  1 | 29-12-17 | 07-01-18 | 
|  444 |  2 | 30-12-17 | 09-01-18 | 
+---------+---------+----------+----------+ 

table_two

​​

である私は、アイデアがある

//results comes from somewhere else, it looks something like this for example: 
array (
    "user_id" => "poly_id of the last gas station" 
    "900" => 1, 
    "444" => 10 
) 
foreach ($result AS $res) { 

    $query = " 

     SELECT 
        table_one.name AS name 
     FROM 
        `table_one` 
       LEFT JOIN 
        `table_two` ON table_one.poly_id = table_two.id 
       WHERE 
        `table_two`.type = 'gas station ' 
       AND 
        table_one.user_id = $res['user_id'] 
       AND 
        table_one.poly_id != $res['poly_id'] 
       AND 
        table_one.in >= "some date from' 
       AND 
        table_one.out <= 'some date to' 
       AND 
        (FIND_IN_SET('general', table_two.product) > 0 OR FIND_IN_SET('cars', table_two.product) > 0) 

       ORDER BY out DESC LIMIT 1 

    "; 

    //if the results is not empty use the result['name'] 
} 

次のようになり、作業のソリューションを持っていますユーザーの最後のガソリンスタンド、しかし、私は日付範囲の間に前のものを見つける必要があります。

私が言ったように、上の例はうまくいきますが、私は一度に複数の結果を処理できる必要があります。結果は〜2000です。 これは、リクエストごとに2000以上のクエリを意味します。

  1. このループのループを何とか最適化して1つにすることは可能ですか?リクエストごとに2000個のクエリを実行しないのですか?
  2. 可能な場合、どのように:D

感謝。

答えて

1

このクエリは、最後に が入力されたuser_idを含む戻り値を返します。ここ

一つのことと同じ 日2時間でユーザー出口はあなたがあなたのコード

select 
    user_id, 
    in, 
    out 
    from table_one t1 
    INNER JOIN ( 
     select 
     user_id 
     max(out) as 'max_out', 
     from 
      table_one 
     where 
     in >= ? AND 
     out <= ? AND 
     ploy_id not in [list_of_unwanted_ploy_id] 
     -- you can specify any condition here 
     group by user_id 
    ) l_out on t1.user_id = l_out.user_id and t1.out = l_out.max_out 
where 
    t1.user_id in [list_of_user_id] 
第二 レコードをスキップすることができ、そのユーザーの2つのレコードを持っている場合、あなたは、日付ではない日時を使用して あるので、
+0

データベース内の実際のタイムスタンプ。その超複雑な質問は質問自体にとって簡単にしようとしていたので – Izopi4a

+0

あなたは結果に2つのuser_idを持たないので、同じ 'out'値を持つ2つのレコードを持つことはありません – Cherif

+0

微妙に良い男、ありがとう。私はそれをテストするために少し時間が必要です。私がそれを得たら、私はあなたに知らせるでしょう。しかし、最初の見所でそれはすごく見える。ありがとう! – Izopi4a

関連する問題