1

このクエリは LEFT 結合の代わりに 1 つの JOIN を作成しますが、cierre_mensual テーブルを使用する wheres 句を使用しない方法がわかりません。

SELECT last_odometro.equipo, IFNULL(SUM(cierre_mensual.recorrido),0) + 
      last_odometro.recorrido AS ultimo_odometro
FROM (
    SELECT *
    FROM `cierre_mensual`
    WHERE mes < '2012-03-01'
    AND `tipo_de_recorrido`
    IN ( 1, 3 )
    GROUP BY `equipo`
    HAVING MAX( mes ) 
) AS last_odometro
LEFT JOIN 
    `cierre_mensual` ON last_odometro.`equipo` = cierre_mensual.`equipo`
WHERE 
        cierre_mensual.mes > last_odometro.mes
    AND cierre_mensual.mes < '2012-03-01'
GROUP BY `last_odometro`.`equipo`

テーブルのフィールドは次のとおりです。

1)tipo_de_recorrido が (1,3) である最後の mes(date) の recorrido を見つけたい 2) 存在する場合は、より大きな mes の残りの recorrido を合計

equipo  mes     combustible_en_tanque   recorrido   tipo_de_recorrido
7   2011-07-01  4   100     2
7   2011-07-01  4   100     2
7   2011-08-01  4   193900  1
7   2011-09-01  4   194000  1  <- the last row of type 1 194000
7   2011-10-01  4   100     2   +=100
7   2011-11-01  4   100     2   +=100 
7   2011-12-01  4   100     2   +=100
7   2012-01-01  7   150     2   +=150
7   2012-02-01  4   50  2       +=50

その戻り値:

equipo  ultimo_odometro
   7     195150  

ただし、次の場合:

7   2011-07-01  4   100     2
7   2011-07-01  4   100     2
7   2011-08-01  4   193900  1
7   2011-09-01  4   194000  1  <- the last row of type 1 194000
no more rows whit type!=(1,2)

194000 を返す必要がありますが、結合は失敗します。

4

1 に答える 1

4

WHERE句からLEFT JOIN'sON句に条件を移動できます。

LEFT
JOIN `cierre_mensual`
  ON last_odometro.`equipo` = cierre_mensual.`equipo`
 AND cierre_mensual.mes > last_odometro.mes
 AND cierre_mensual.mes < '2012-03-01'
于 2012-07-13T20:33:18.033 に答える