電話番号列に基づいてデータベースの通話記録に国コードを追加する方法を見つけようとしています。国とそのダイヤルコード (国と呼ばれます) を含むテーブルがあります。すべてのレコードをクエリして国コードを追加することはできますが、結果をフィルタリングしてページネーションできる必要があります。
私はあまり制御できないシステムを使用しているため、テーブルに新しい列を追加したり、コードの大きな部分を書き直したりすることは実際には選択肢ではありません。それが私が対処しなければならないことです。
国/地域の表。
id | ###名前###ダイヤルコード | |
---|---|---|
353 | 2 | ###アメリカ合衆国###|
通話記録テーブル。 |
開始日時
ルートID | ###電話番号###duration_秒 | 1 | 2014-12-18 18:51:12 | ||
---|---|---|---|---|---|
60 | 2 | 2014-12-18 17:41:02 | 2014-12-18 17:43:02 | 43 | |
120 | ルーティングテーブル。 | id | ###番号###
1 | 43 | |
---|---|---|
route_id、route_number でグループ化されたすべての一意の電話番号の継続時間の合計値を取得する必要がありますが、発信者を国ごとにグループ化できるように、これらの結果を country_id でグループ化する必要があります。以下の mysql クエリを使用して、期間の合計値、一意の電話番号の合計数を取得します。これらはすべて、route_id、route_number でグループ化されています。このクエリは、ずっと前に別の開発者によって作成されました。 | リーリー | country_id でグループ化できるように、country_id を右側の結合テーブルに追加する作業はすべて完了しました。|
Left(a.phonenumber, strlen($dialling_code)) = $dialling_code | ルート ID、ルート番号、国 ID でグループ化できるように、国テーブルを使用して国 ID を含む結合テーブル クエリに列を追加するにはどうすればよいですか?以下の表に示すとおりです。 |
id
開始日時
終了日時
ルートID
###電話番号###
国ID
1 | 2014-12-18 18:51:12 | 2014-12-18 18:52:12 | ###23###3538700000 | 60 | 1 | |
---|---|---|---|---|---|---|
2014-12-18 17:41:02 | 2014-12-18 17:43:02 | 43 | 18700000 | 120 | 2 | |
routes
からcallrecord_join
へのRIGHT JOIN
は、すでにINNER JOIN
サブクエリが間にあるため、何も行われません。 Route
とcallrecord
は結合の右側にあります。説明した結合を使用できます -
リーリーしかし、同じ結果が得られます:
リーリーもう少し安くなるといいですね。
国
が含まれていることをテストして、callrecord
内の番号が複数の国に追加されていないことを確認する必要があります。一部の国際ダイヤル コードはあいまいであるため、使用するダイヤル コード リストによって異なります。明らかに、データセットが非常に大きい場合は、上記のクエリをバッチ処理する必要があります。
物事を単純化しすぎていないことを願っていますが、あなたの質問を理解すると、クエリは次のとおりです。
リーリー適切なインデックスが利用可能であると仮定して、これらの条件を制御可能にするために、
startdatetime
からDATE_FORMAT()
を慎重に削除してください。