0

私はすでにこれについてここで質問しました。しかし、私を大いに助けてくれる答えが得られなかったので、もう一度質問したいと思います.

    In Database [1]
    Table Characters
+----+------------------+-------+---------+
|account_name| lastaccess| online| voted  |
+------------+-----------+-------+--------+
| Account1   | 1231321231|   1   |    1   |
| Account1   | 132312213 |   0   |    0   |
| Account3   | 13231212  |   0   |    0   |
+------------+-----------+-------+--------+
    In Database [2]
    Table Accounts
+----+------------------+
|   Login   | lastIp    | 
+-----------+-----------+
| Account1  | 0.0.0.0.0 |
| Account1  | 0.0.0.0.0 |
| Account3  | 0.0.0.0.0 |
+-----------+-----------+

lastIP アカウントの場所を取得する関数を既に持っています。

function getclientip()
    {
        if ( isset($_SERVER["REMOTE_ADDR"]) )    { 
            return $_SERVER["REMOTE_ADDR"]; 
        } else if ( isset($_SERVER["HTTP_X_FORWARDED_FOR"]) )    { 
            return $_SERVER["HTTP_X_FORWARDED_FOR"] ; 
        } else if ( isset($_SERVER["HTTP_CLIENT_IP"]) )    { 
            return $_SERVER["HTTP_CLIENT_IP"] ; 
        }
            return "0.0.0.0";
    }
$Ip=getclientip();
$sql='SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\';';
echo mysql_error();
$result = mysql_query($sql);
if (false === $result) {
}
while($row = mysql_fetch_array($result))
{

私がしたいことは次のとおりです。

mysql_query('update characters SET voted=1 where account_name like \''.$row['login'].'\' and online=1;') ;

しかし、どこMIN(lastaccess)だけ。あなたが私の心を理解してくれることを願っています。それ以外の場合は、もっとよく説明します。

4

2 に答える 2

0

理解を深め、紛らわしい部分を削除するために、私の答えを説明しようとします。

私はあなたのコードのこの部分を保持しました:

function getclientip()
    {
        if ( isset($_SERVER["REMOTE_ADDR"]) )    { 
            return $_SERVER["REMOTE_ADDR"]; 
        } else if ( isset($_SERVER["HTTP_X_FORWARDED_FOR"]) )    { 
            return $_SERVER["HTTP_X_FORWARDED_FOR"] ; 
        } else if ( isset($_SERVER["HTTP_CLIENT_IP"]) )    { 
            return $_SERVER["HTTP_CLIENT_IP"] ; 
        }
            return "0.0.0.0";
    }
$Ip=getclientip();

これで、SQL のこの行を更新コード行に結合できます。これは、この行を意味します。

$sql='SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\';';

そしてこの行:

mysql_query('update characters SET voted=1 where account_name like \''.$row['login'].'\' and online=1;') ;

あなたが質問に書いたこと、今この部分を結合した結果は次のとおりです。

$sql='UPDATE characters SET voted=1 where online=1 AND account_name IN (SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\');';

ここで MIN(lastaccess) のみを更新したい場合は、このクエリを使用できます。そのため、lastaccess で行を昇順で並べ替え、その平均は lastaccess 列の下から上に移動してから、この行の一番上を選択します。つまり、a を選択します。最小の lastaccess を持つ行を指定し、それを set voted=1 の update コマンドに渡しました。

UPDATE characters SET voted=1 where online=1 AND account_name IN
(SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\' ORDER BY lastaccess ASC LIMIT 1);

そして、一時テーブルを使用し、MIN 関数を使用することができます。

UPDATE characters SET voted=1 where online=1 AND account_name IN
(SELECT tempTable.login FROM (SELECT login, MIN(lastaccess) FROM accounts WHERE lastIp like \''.$Ip.'\' GROUP BY login) tempTable;

更新コマンドのため、結果に行がないことを忘れないでください..

mysql_query('UPDATE characters SET voted=1 where online=1 AND account_name IN
    (SELECT login FROM accounts WHERE lastIp like \''.$Ip.'\' ORDER BY lastaccess ASC LIMIT 1);');

また

mysql_query('UPDATE characters SET voted=1 where online=1 AND account_name IN
(SELECT tempTable.login FROM (SELECT login, MIN(lastaccess) FROM accounts WHERE lastIp like \''.$Ip.'\' GROUP BY login) tempTable;');

私は願っています、あなたが必要とするものです。

于 2013-04-03T21:08:04.770 に答える