0

mySQLデータベースに2つのテーブルがあります。

最初のテーブルはispです:

isp_ip_address | isp_name
-------------------------
157.55.33.0    | isp_3

157.55.0.0     | isp_1

193.219.9.0    | isp_2

65.55.213.0    | isp_4

195.182.85.226 | isp_5

78.58.5.117    | isp_6

78.58.5.0      |  isp_7

2番目のテーブルはuser_statsです。

uid | lastlogin_ip | lastlogin
------------------------------
111 | 78.58.83.111 | 2013-03-12

132 | 78.58.5.117  | 2013-03-12

258 | 195.182.85.226 | 2013-03-14

165 | 157.55.33.78  | 2013-03-12

822 | 65.55.213.216 | 2013-03-15

523 | 157.55.35.38 | 2013-03-12
.....

等々。

ユーザーlastlogin_ipをisp_ip_addressと比較し、新しいテーブルにuid、lastlogin_ip、およびisp_nameを挿入する必要があります。私はこのようにip_addressを比較する必要があります:完全なlastlogin_ipがisp_ip_addressと等しい場合、検索を停止してisp_nameを書き込みます。それらが一致しない場合、IPアドレスの最初の3つの部分を比較して同じことを行う必要があり、3つの部分が一致しない場合、IPアドレスの2つの部分を比較して同じことをする必要があります。

次のSQLコードを試しました。

SELECT 
  user_stats.`uid`,
  user_stats.`lastlogin_ip`,
  isp.`isp`,
FROM
  stats.`user_stats` 
  LEFT JOIN stats.`isp` 
ON(
    IF(
      isp.isp_ip_address LIKE user_stats.`lastlogin_ip`,
      isp.isp_ip_address LIKE user_stats.`lastlogin_ip`,
      IF(
        SUBSTRING_INDEX(isp.isp_ip_address,'.',-1) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',-1),
        IF(
          SUBSTRING_INDEX(SUBSTRING_INDEX(isp.isp_ip_address,'.',3),'.',-1) LIKE SUBSTRING_INDEX(SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',3),'.',-1),
          IF(
            SUBSTRING_INDEX(SUBSTRING_INDEX(isp.isp_ip_address,'.',2),'.',-1) LIKE SUBSTRING_INDEX(SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',2),'.',-1),
            SUBSTRING_INDEX(isp.isp_ip_address,'.',1) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',1),
            NULL),
          SUBSTRING_INDEX(isp.isp_ip_address,'.',2) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',2)),
        SUBSTRING_INDEX(isp.isp_ip_address,'.',3) LIKE SUBSTRING_INDEX(user_stats.`lastlogin_ip`,'.',3))));

このコードはIPアドレスの一部を比較しますが、行を複製します。つまり、3つの等しい部分と2つの等しい部分が見つかった場合、同じ行を異なるisp_name値で2回書き込みます。

このコードを編集して正常に機能させるためのヒントを教えてください。どんな助けでもいただければ幸いです!

4

3 に答える 3

0

参加基準が説明に対応していません。負のカウントで使用すると、左側ではなくsubstring_index右側を返しますip

とにかく、次の参加基準を試してください(テストされていません):

ON(
   isp.isp_ip_address = user_stats.lastlogin_ip
OR SUBSTRING_INDEX(isp.isp_ip_address,'.', 3) = SUBSTRING_INDEX(user_stats.lastlogin_ip,'.', 3)
OR SUBSTRING_INDEX(isp.isp_ip_address,'.', 2) = SUBSTRING_INDEX(user_stats.lastlogin_ip,'.', 2)
)
于 2013-03-25T10:17:57.027 に答える
0

IPアドレスとCIDRを整数として格納してから、次のようなものを使用する方がよいのではないでしょうか。SELECTクエリから直接IPとIP + CIDRを照合する方法はありますか?

  1. これらのクエリを読む方が簡単です
  2. おそらくあなたが現在持っているものよりも速い
  3. 比較は、サブストリングの比較よりも(ネットワークの観点から)より正確です。
于 2013-03-25T10:37:09.810 に答える
0

非常にテストされていませんが、うまくいけば正しい軌道に乗るはずです:

編集:構文が修正され、テストされたqry。

SELECT match3.lastlogin_ip、ifnull(match3.isp_name、isp.isp_name)as isp_name FROM
(SELECT match4.lastlogin_ip、ifnull(match4.isp_name、isp.isp_name)as isp_name、isp.isp_ip_address FROM
  (SELECT user_stats.lastlogin_ip、isp.isp_name、isp.isp_ip_address FROM user_stats
  LEFT JOIN isp ON(user_stats.lastlogin_ip = isp.isp_ip_address))as match4
  LEFT JOIN isp ON(match4.isp_nameはnullで、SUBSTRING_INDEX(match4.lastlogin_ip、'。'、3)= SUBSTRING_INDEX(isp.isp_ip_address、'。'、3)))as match3
LEFT JOIN isp ON(match3.isp_nameはnullで、SUBSTRING_INDEX(match3.lastlogin_ip、'。'、2)= SUBSTRING_INDEX(isp.isp_ip_address、'。'、2));
于 2013-03-25T14:03:11.433 に答える