复杂的查询循环到单个循环中

时间:2017-04-25 10:18:00

标签: mysql

我需要一些帮助来制作一个复杂的查询,我会尝试解释下面我想要完成的事情。

这是我的数据

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

+----+---------+-------------+---------+
| id |  name   |    type     | product |
+----+---------+-------------+---------+
|  1 | city 1  | gas station | general |
|  2 | city 2  | workshop    | general |
|  3 | city 3  | paint       | bikes   |
|  4 | city 4  | paint       | general |
|  5 | city 5  | gas station | cars    |
|  6 | city 6  | gas station | bikes   |
|  7 | city 7  | paint       | cars    |
|  8 | city 8  | workshop    | cars    |
|  9 | city 9  | gas station | general |
| 10 | city 10 | gas station | cars    |
| 11 | city 11 | gas station | general |
+----+---------+-------------+---------+

我有一个看起来像这样的工作解决方案

//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. 是否有可能以某种方式将这个查询循环优化为单个查询,因此我不会对每个请求执行2000次查询?
  2. 如果可能,如何:D
  3. 感谢。

1 个答案:

答案 0 :(得分:1)

此查询将返回包含user_id的结果 输入给定的周期。

这里有一件事,因为你是 如果用户退出,则使用日期而不是日期时间 第二天你将有两个用户记录,你可以跳过第二个 在你的代码中记录

 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]