1

私はこのようなクエリを持っています:

  Select E.ID, E.NAME, 
     date_format(  CONVERT_TZ( CONVERT_TZ( E.ST, '+00:00', '+5:00' ),
     '+00:00', if( ET.GT LIKE '%.5', REPLACE( ET.GT, '.5', ':30' ) , CONCAT( ET.GT, ':00')
  ) ), '%Y-%m-%e %r'), concat( date_format(  CONVERT_TZ( CONVERT_TZ( E.ET, '+00:00', 
  '+5:00' ) ,   '+00:00', if( ET.GT LIKE '%.5', REPLACE( ET.GT, '.5', ':30' ) , CONCAT( 
  ET.GT, ':00' ) ) ), '%Y-%m-%e %r') , ' ', if ( TC is NULL, '', concat(TC, 'T'))),
  EE.CL, EC.EC, CONCAT( '##PATH##', E.ID, '/') 

これらのフィールドは、4つの異なるテーブルから取得されます。条件、フォーマットなどは、テーブルの1つからの設定ごとに、日付を東部から特定のタイムゾーンに変換することです。

確かに見栄えの良いクエリではありません:-)。これが理由です、私はクエリでこれらすべての奇抜なことをしようとしています。

  1. これらの結果は配列として返され、JSONとしてエンコードされて、呼び出し元に返送されます。
  2. PHPで結果をループする必要はありません。結果をそのまま渡すことができます。
  3. 不要な余分な列について心配する必要はありません。必要な列だけを引っ張ることができます。

これは私にとってうまく機能しています!

ただし、パフォーマンスおよびその他の設計の観点からは、次のようになります。

質問:そのままにしておくのは良いですか、それともPHPで処理を行うことを考える必要がありますか?クエリの複雑さを取り除くときは、2つのことを行う必要があります(If、Convert_Tzなど)

  1. 返された配列をループし、関数を呼び出してタイムゾーンを計算します。
  2. 不要な配列要素を削除します。

あなたの考え?

編集:

結合は次のとおりです。

 LEFT JOIN eeemps EER ON e.id = EER.eid
 LEFT JOIN eemp Ee ON eer.empid = ee.empid
 LEFT JOIN EclassS EC ON E.EVN = EC.E_ID 
 LEFT JOIN E_tz NE ET ON E.TZID = ET.ID

 where date between x and y, and e_id = 123

それがすべて「どこ」の条件です。テーブル名とフィールド名は無視してください。私はそれらを変更しました。

4

1 に答える 1

0

サーバーのPHP部分には、おそらくすでにいくつかの優れた機能があるため、MySQLで可能な限り多くのことを行うことが、問題に対処する正しい方法です。さらに、MySQLの方法はPHPの100倍から99倍高速です。そして、大きなクエリについて心配する必要はありません。可能であれば、コードを生成して(結合など)、難しいことを簡単にするためにフォーマットが非常に重要であることも覚えておいてください。

于 2012-05-09T14:08:07.273 に答える