2016-05-13 12 views
0

私は次のクエリを持っている:書き換えクエリ

SELECT f.flight_number, f.flight_date, f.airport, a.iata, a.iso3166 AS airport_country_code, air.icao 
     FROM flights_database f 
     LEFT JOIN airlines air ON air.name = f.airline 
     JOIN airports a ON f.airport = a.airportNameClean 
     WHERE f.flight_date 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE_ADD(CURDATE() , INTERVAL 1 DAY) 
     GROUP by f.flight_date, f.airport, f.flight_number, a.iata 
     ORDER by f.airport, f.flight_number 

今私は、MySQLをアップグレードしたとonly_full_group_by settingが起動します。

Expression #6 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'air.ICAO' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by 

はもちろん、私は、この設定を無効にすることもできますが、私は、この設定が理由で導入された理解して実行します。 このクエリは、もはやこのフォームで動作しません。単にicaoGROUP BY句に追加するだけで、異なる結果がもたらされます。

この設定を有効にして同じ動作を実現するには、どのようにこのクエリを書き直すことができますか?

+0

いくつかのicaoがある場合、どのような結果が予想されますか?単にmax(icao)、min(icao)を行うことはできませんか? – jarlh

+0

@jarlh実際にはこの作品(MAX)は、あなたがvarcharsにそれを適用できるとは考えていませんでした。偉大な仕事をしているようだ。これを答えると、私はそれを受け入れます。 – edwardmp

答えて

1

max(icao)は簡単にできませんか?

SELECT f.flight_number, f.flight_date, f.airport, a.iata, a.iso3166 AS airport_country_code, max(air.icao) 
     FROM flights_database f 
     LEFT JOIN airlines air ON air.name = f.airline 
     JOIN airports a ON f.airport = a.airportNameClean 
     WHERE f.flight_date 
     BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE_ADD(CURDATE() , INTERVAL 1 DAY) 
     GROUP by f.flight_date, f.airport, f.flight_number, a.iata 
     ORDER by f.airport, f.flight_number 
+0

素晴らしい作品です!それはちょっとハックのような気がしますが、まあです。 – edwardmp

+0

とにかく前よりもハックが少ない!これで、その列に対して定義された結果が得られます。 – jarlh

関連する問題