| PHP Developer Forum Hier habt ihr die Möglichkeit, eure Skriptprobleme mit anderen Anwendern zu diskutieren. Seid so fair und beantwortet auch Fragen von anderen Anwendern. Dieses Forum ist sowohl für ANFÄNGER als auch für PHP-Profis! Post your PHP questions here! |
 |

16-11-2009, 05:03
|
|
Veldor
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 3
|
|
Top stats script problem
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:
Code:
SELECT * FROM characters ORDER BY data(explode..nr1517)
Also die kills sind im data wenn man den explodet nr 1517
|

16-11-2009, 08:31
|
|
code-kobold
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 20
|
|
Zitat:
|
/.../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
|

16-11-2009, 10:20
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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
|

16-11-2009, 15:14
|
|
Veldor
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 3
|
|
AmicaNoctis, leider ist das eine Datenbank von einem Spielserver und wenn ich die umändere puh
Hallo Code-kobold nochmal
Code:
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',
so sieht die aus  (zumindest ein teil davon :P) und wie gesagt die kills stehn im data feld
Geändert von Veldor (16-11-2009 um 15:19 Uhr)
|

16-11-2009, 15:27
|
unset
 Moderator
|
|
Registriert seit: Jan 2007
Ort: Düsseldorf
Beiträge: 3.778
|
|
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)!
|

16-11-2009, 15:33
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
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.
|

16-11-2009, 15:45
|
|
Veldor
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 3
|
|
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
|

16-11-2009, 15:49
|
AmicaNoctis
 Moderatorin
|
|
Registriert seit: Jul 2009
Beiträge: 5.550
|
|
Zitat:
Zitat von Veldor
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.
|

16-11-2009, 22:53
|
|
code-kobold
Registrierter Benutzer
|
|
Registriert seit: Nov 2009
Beiträge: 20
|
|
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
|
|
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
|
|
|
| Themen-Optionen |
|
|
| Thema bewerten |
|
|
Forumregeln
|
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.
HTML-Code ist aus.
|
|
|
|
PHP News
|