IP情報GROUP_CONCATを使用してmysqlのダンプ機能 - リモートログイン認証を達成するために、単純な

使用時に本はいくつかの嫌っています。ログテーブルからユーザーのホワイトリストエントリに、各ユーザーの統計情報を収集、記録IP情報:最近、私は、ファンクションポイントに遭遇しました。

この機能は、一度のみ(初期化)が行われるが、データの量は、大きくなるJavaコードを実行してもよい/ Pythonスクリプトは遅いです。私は圧倒されたと私の小さなパートナーは、ストアドプロシージャを完全考えるのと同じように、ファン総控えめな表現は、SQLまあ、それほど複雑でやっていないことを、言うには?

疑問符を顔、私は予想最も簡単な解決策は、ループのネストされた2つが必要になります、SQLを解決することができますか?

GROUP_CONCAT:ドミンゴは、この時間の関数と言ってくれました。これは、この関数であり、瞬時に私の問題を解決します。

1.需要

オフサイトの検証の頻度を減らすために、ユーザーのホワイトリスト機能を実装したいです、SMS費は、支出を減らします ユーザーログインエクスペリエンスを向上させます。

2.原則

同様の機能は、以前に接触していないために、このメソッドは実装されている:最初の3の後に、ユーザーのIP着陸を格納するためのユーザ・テーブルのフィールドにIPホワイトリストに新しいユーザーを、市に上陸かどうかを決定します。このアプローチは、いくつかの都市では、IPアドレスの大きなスパンを持って、比較的愚かです。時間が経過した後、正確な地方にそれを区別するための方法を記述します。大物はまた、私は他の認証方法を学びましょう、指導を歓迎しました。

3.データのインポート

以前は、大きなテーブルの使用は、ユーザがユーザIDとIP情報を含む前記ユーザインターフェースのコール記録を記録します。この表では、複数の行に対応するユーザは、あるIPは、(あってもよいアカウントの複数に対応する)複数のレコードに対応することができます。私は無意識のうちに仕事を完了するために、JavaプロジェクトまたはPythonスクリプトを書きたかったです。しかし、JavaのツールのJavaプロジェクトをビルドする必要が依存状況を決定するために、Pythonのネイティブ・データベース・リンクの処理が遅い(大量のデータ)です。I小林と協議した後、ストアドプロシージャがトリッキー解決するために、比較的簡単だと思いますか書きます。

ただ、準備ができたら、手を、私とドミンゴが文を訴えた。このような複雑な機能を、どのように完全なSQLだろうか?ドミンゴは、それが十分なSQLがクリーンアップインポートされたユーザデータテーブルを完了するために、ことを示して、私のニーズを理解し、私は機能をお勧めしますgroup_concat

group_concat、そしてconcatスプライシングの文字列のため、などです。しかし、concatシナリオは異なっているgroup_concat、主に適用されるgroup by分類文をステッチした後、結果フィールド。基本的な構文は次のとおりです。

group_concat( [distinct] 待连接字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )

その声明への問い合わせselectバッチの後には、簡単にユーザー・グループのIP情報を取得完了することができます。

select SELECT create_user_id, group_concat( DISTINCT concat( '#', SUBSTRING_INDEX   ( ip_address, '.', 3 ) ) SEPARATOR '' ) FROM sys_log GROUP BY create_user_id;

設計を満たすために(IPホワイトリストフォーマット#1 xxx.xxx.xxx):前SUBSTRING_INDEX文字列を取得する第三の関数を使用して、連結前に切断するために「#」スプライスIPフィールドを使用して、「」ヌル区切りに置き換え(「」)カンマをデフォルトとなるキーワードの区切りGROUP_CONCAT関数を使用します。実行後、唯一のユーザーのIPは、ユーザーIDと指定されたフォーマットをホワイトリストに登録しました。

変更のユーザテーブルが直接審査員の数を増やし、上記更新SQL文に配置することができ、SQLは、完全なダンプIPアドレスは次のとおりです。

update sys_user a
set a.address_ip = (SELECT group_concat(distinct concat('#', SUBSTRING_INDEX(ip_address, '.', 3)) separator '')
                    FROM sys_log b
                    where b.create_user_id = a.id
                    group by create_user_id);

END〜

参考文献:

第12章関数と演算子 - MySQLの公式文書

センス謝Mingge、小林提案援助

〜について議論することを学ぶために私に連絡して自由に感じます

メール:[email protected]
マイクロチャネル:こんにちは-wgh0807
QQ:490 536 401

おすすめ

転載: www.cnblogs.com/wgh0807/p/11654659.html