Warnung: file_put_contents(/home/www/web1/html/php_dev/test.txt) [function.file-put-contents]: failed to open stream: Permission denied in /home/www/web1/html/php_dev/sys/lib.activity.php (Zeile 58)
Top stats script problem [Archiv] - PHP-Scripte PHP-Tutorials PHP-Jobs und vieles mehr

- Ad -
php-resource




Archiv verlassen und diese Seite im Standarddesign anzeigen :
Top stats script problem


 
Veldor
16-11-2009, 05:03 
 
Hallo ihr lieben :)

So... Wie soll ich anfangen.

Ich möchte aus einer Datenbank eines Spiels die top 5 spieler rausfischen die am meissten Leute getötet haben. Folgendes Problem die Kills stehn in der Tabelle Characters -> Data das problem ist das im Data mehrere sachen drin stehn und zwar um genau zu sein mehr als 1800 einträge die mit einer leerstelle getrennt sind. Ich weiss das man da explode benutzten kann aber dann ist noch immer das problem wie ich die mit ORDER BY DESC auslesen kann.

Beispiel damit ihr es noch besser versteh:

SELECT * FROM characters ORDER BY data(explode..nr1517)

Also die kills sind im data wenn man den explodet nr 1517

 
code-kobold
16-11-2009, 08:31 
 
/.../mehrere sachen drin stehn und zwar um genau zu sein mehr als 1800 einträge die mit einer leerstelle getrennt/.../Kannst Du das konkretisieren? Tabellenstruktur und Beispiele sind hier hilfreich.

GZ,

Ron

 
AmicaNoctis
16-11-2009, 10:20 
 
Hallo,

MySQL hat kein explode und mit PHP müsstest du das order by selbst bauen. Es gibt für deine "Datenbank" keine Möglichkeit, das von dir gewünschte vernünftig abzurufen. Daher ist es ratsam, die nochmal neu aufzusetzen, denn mit etwas, das nicht einmal die 1. Normalform erfüllt, hättest du so oder so auf Dauer mehr Ärger als Spaß.

Gruß,

Amica

 
Veldor
16-11-2009, 15:14 
 
AmicaNoctis, leider ist das eine Datenbank von einem Spielserver und wenn ich die umändere puh :)

Hallo Code-kobold nochmal :)

CREATE TABLE IF NOT EXISTS `characters` (
`guid` int(11) unsigned NOT NULL default '0' COMMENT 'Global Unique Identifier',
`account` int(11) unsigned NOT NULL default '0' COMMENT 'Account Identifier',
`data` longtext,
`name` varchar(12) NOT NULL default '',
`race` tinyint(3) unsigned NOT NULL default '0',
`class` tinyint(3) unsigned NOT NULL default '0',
`gender` tinyint(3) unsigned NOT NULL default '0',
`level` tinyint(3) unsigned NOT NULL default '0',
`xp` int(10) unsigned NOT NULL default '0',http://img691.imageshack.us/img691/2356/acca.jpg

so sieht die aus :) (zumindest ein teil davon :P) und wie gesagt die kills stehn im data feld

 
unset
16-11-2009, 15:27 
 
Tja, da musst du wohl oder übel durch. Einzige Alternative ist, die Daten alle Spieler einzulesen und mit PHP sortieren. Aber das kann u.U. ganz schön lange dauern (und mit irgendwelchen Regular Expressions fangen wir bei der Datenstruktur auch gar nicht erst an)!

 
AmicaNoctis
16-11-2009, 15:33 
 
Dann musst du wohl oder übel die data-Spalte mit like filtern (oder im Falle von MyISAM einen Fulltext-Index drauf setzen) und die endgültige Prüfung und Sortierung in PHP machen. Das kostet aber spürbar Speicher und Laufzeit.

Daher rate ich immer noch dazu, die ein oder zwei Tabellen dazu zu bauen. An der Software brauchst du nicht einmal viel ändern, weil du dir ja ein View bauen kannst, in dem diese data-Spalte mit group_concat und einem Join auf die N:M-Tabelle simuliert wird.

Das ist also gar kein Drama und lohnt sich aus Performancegründen absolut.

 
Veldor
16-11-2009, 15:45 
 
Hallo AmicaNoctis :) das hört sich interessant an obwohl ich da 0 versteh werde mir aber mal auf der php seite ansehn wie das funktioniert. Wenn du weitere informationen hast bin ich gerne offen

 
AmicaNoctis
16-11-2009, 15:49 
 
Wenn du weitere informationen hast bin ich gerne offen

Google mal nach "Normalform" und/oder "BCNF". Da findest du massig Ressourcen (auch mit Beispielen) die dir helfen, deine Datenbank zu normalisieren. Dann guckst du dir noch die Themen "left join", "group by", "group_concat" und "create view" an (vorzugsweise im MySQL Handbuch) und setzt das für dich um.

 
code-kobold
16-11-2009, 22:53 
 
Wie unset bereits schrieb, kannst du mit einem simplen PHP-Skript den Inhalt deiner DB zeilenweise auslesen, die Spalte data in ein Array exploden und Array-Index 1516 verarbeiten, falls deine Serverumgebung dies gestattet (Perfomance).

Allerdings solltest du dringend Amicas Vorschlag folgen, und die DB normalisieren; du wirst es nicht bereuen!

GZ,

Ron

- -

Alle Zeitangaben in WEZ +2. Es ist jetzt 21:32 Uhr.