Mysql befehl

06/01/2013 23:33 Spartan#117#16
Hi Leute!

Das Script von Coniesan ist recht performancelastig bei vielen Spielern. (Es geht für jeden Account, egal ob leer oder nicht, die ganze player-Tabelle durch und zählt dabei die Anzahl der Charaktere)

Ich würde empfehlen, die leeren Accounts direkt in einem Query zu finden:
Code:
SELECT account.id,account.login
FROM account.account
LEFT JOIN player.player_index ON player_index.id = account.id
WHERE ISNULL(player_index.id) OR (player_index.pid1 = 0 AND player_index.pid2 = 0 AND player_index.pid3 = 0 AND player_index.pid4 = 0)
Dieser Query zählt ausserdem nicht durch die ganze Charaktertabelle, sondern nutzt die player_index-Tabelle, was auch Ressourcen spart.

Coniesan kann das Script ja anpassen, wenn er Lust hat. :) (ich hatte keine Lust dazu)
06/01/2013 23:58 Coniesan#17
Kleiner Denkfehler beim Benutzen der player_index!
Wenn man keinen Char besitzt, existiert auch kein Eintrag in dieser Tabelle, wobei mir dennoch eine Idee kommt! Ich werde diese mal kurz durch gehn!
06/02/2013 00:05 Spartan#117#18
Quote:
Originally Posted by Coniesan View Post
Kleiner Denkfehler beim Benutzen der player_index!
Wenn man keinen Char besitzt, existiert auch kein Eintrag in dieser Tabelle, wobei mir dennoch eine Idee kommt! Ich werde diese mal kurz durch gehn!
Keine Sorge, daran habe ich auch gedacht. :)

Wenn kein Eintrag mit dieser ID in der player_index gefunden wird, ist der Inhalt von beispielsweise der "player_index.id" Spalte NULL. Dieser Befehl, welchen du übrigens auch im Query findest, prüft ob diese Spalte NULL ist.
Code:
ISNULL(player_index.id)
06/02/2013 00:12 Coniesan#19
jojo :D das hab ich dann soweit auch schon bearbeitet gehabt ;)
Also hier das bearbeitete Script, und nochmal danke für die SQL :D
PHP Code:
<?php
    
// Temp. SQL connection
    
$sqlCon mysql_connect('127.0.0.1''root''pass');
    
//Auslesen der leeren Acc's
    
$sql=mysql_query('SELECT account.id,account.login FROM account.account LEFT JOIN player.player_index ON player_index.id = account.id WHERE ISNULL(player_index.id) OR (player_index.pid1 = 0 AND player_index.pid2 = 0 AND player_index.pid3 = 0 AND player_index.pid4 = 0);')or die(mysql_error());

    
// Normaler Seitenaufruf mit Leeren acc's abfrage
    
if(empty($_POST))
    {    
        
$count 0;
        while(
$get mysql_fetch_object($sql))
        {    
            
$acc_id=$get->id;
            
$acc_login=$get->login;
            echo 
$acc_id.' - '.$acc_login.'<br>';
            
$count $count+1;
        }
    }
    
    
// Seitenaufruf bei gesendetem delete Post
    
if(!empty($_POST))
    {
        
$count 0;
        if(
$_POST['delete'])
        {
            while(
$get mysql_fetch_object($sql))
            {
                
$acc_id=$get->id;
                
$acc_login=$get->login;
                
mysql_query('DELETE FROM account.account WHERE id='.$acc_id.';')or die(mysql_error());
                
$count $count+1;
            }
        }
        echo 
'Es wurden <b>'.$count.'</b>-leere Accounts wurden gelöscht!<br><br>';
    }
    
// HTML User Delete Abfrage
    
If(empty($_POST))
    {
        if(
$count>0)
        {
            echo
'--------------------------<br>
            Es sind <b>'
.$count.'</b> leere Accounts vorhanden<br>
            Möchtest du alle diese Accounts löschen?
                <form action="#" method="POST" name="deleteform"><input type="submit" name="delete" value="JA!" /></form>
            '
;
        }
        else 
            echo 
'Keine Accounts vorhanden!';
    }
?>
06/02/2013 00:19 nostradame37#20
das script wird einmahlig benutzt alle 2-3 monate und nuhr dan ist es auch activ
also wird es auscomentiert wen es nicht gepraucht wird .
bei 13k+ accounts kanst lange suchen welche jetzt chars besitzen und welche nicht
mfg
06/02/2013 00:23 Spartan#117#21
Quote:
Originally Posted by Coniesan View Post
jojo :D das hab ich dann soweit auch schon bearbeitet gehabt ;)
Also hier das bearbeitete Script, und nochmal danke für die SQL :D
Code:
 OR (player_index.pid1 = 0 AND player_index.pid2 = 0 AND player_index.pid3 = 0 AND player_index.pid4 = 0)
Warum hast du denn diesen Teil des Querys rausgenommen? :confused:

Wenn jemand einen Char erstellt und diesen wieder löscht, bleibt der player_index Eintrag, obwohl keine Chars mehr vorhanden sind, und dieser enthält dann bei jeder der pid Spalten eine 0, daher diese Überprüfung.

Ich bin nunmal perfektionist, haha. :D
06/02/2013 00:23 Coniesan#22
man könnte ja n Autoscript schreiben, welches jeden Tag guckt, ob und welcher Acc länger als 2 Monate (oder, wie mans halt gern hätte) nicht benutzt wurde, und die dort gelisteten automatisch löscht :D

#Edit: Ja sry, habs ausm Queryeditor Copy&Paste raus :D da hab ich als Experiment den Part raus geschmissen gehabt ;)