[MySQL Query] Daten mehrerer Tabellen auswerten

fragger1991

New Member
Hallo,

folgendes Problem, ich habe 2 Tabellen aus welchen ich Daten in einem Query verarbeiten will. Ich möchte die Maximale Auslastung der einzelnen Server beachten und automatisch einen Server auswählen welcher die Slots noch tragen kann.

Meine Datenbankstruktur:

Prefix: leihen_

GameServer Einträge (loan_server)
Code:
machineID | slots
1 | 12
2 | 32
1 | 10
3 | 12
5 | 16

Dedicated Server Einträge (machines)
Code:
machineID | max_slots
1 | 30
2 | 42
3 | 120
5 | 100

Vergeben werden sollen nun: 10 Slot

Nun muss ich (MachineID = 1):
(max_slots - soll_vergeben_werden) >= slots
(30 - 10) [= 20] >= 22

Natürlich kann dieser Server nicht auf dem MachineID 1 erstellt werden, also muss er mir einen anderen Suchen, hier dann den 2ten.

Bisher habe ich mir diesen Query zusammengestellt:
Code:
SELECT machines.`machineID`, SUM(loan.`slots`) AS `slots` FROM `leihen_machines` AS `machines`, `leihen_loan_server` AS `loan` WHERE (machines.`max_slots` - 10) >= loan.`slots` GROUP BY machines.`max_slots`

Funktionieren tut er aber nicht, er gibt mir immer die Falsche ID aus. So wie es scheint liegt es an slots in der WHERE Klausel, trage ich dort manuell 22 ein, gibt er mir Server Nr. 2 aus.

Danke!
 
Code:
SELECT machines.machineID, machines.max_slots-sum(loan_server.slots) AS free 
FROM machines
JOIN loan_server ON loan_server.machineID = machines.machineID
GROUP BY machines.machineID
HAVING free >= 10;

Gibt dir die Systeme zurück, die mindestens 10 Slots frei haben.
 
Klasse, danke :D

Ich schätze mal es war einfacher einen Query zu schreiben als meinen zu "Debuggen" oder? Würde nämlich mal wissen was ich da falsch gemacht habe :D

Liegt es nur daran das ich nicht machineID abgefragt und abgeglichen habe?
 
Die Probleme mit deinem Query:
  • Cross Join (keine Bedingung zum Verknüpfen der Tabellen)
  • falsche WHERE Klausel (du prüfst die maximale Belegung gegen die Belegung für einzelne Kunden-Server und nicht die Gesamtzahl an bereits belegter Slots)
  • falsche Gruppierung

Um das zu verbessern, muss man es neu schreiben. Und das hab ich getan. ;)
 
:DDas stimmt natürlich, aber ich denke das es an Punkt #2 liegt :D

Der Query hat ansonsten ja soweit Funktioniert.

Macht das denn einen großen Unterschied zwischen deiner und meiner Methode? Hab mich bisher auch noch nicht wirklich ausgiebig mit RIGHT, LEFT, INNER, ... JOIN beschäftigt, dafür benutze ich es zu selten.
 
Da steht alles schön beschrieben: http://en.wikipedia.org/wiki/Join_(SQL)
Zu den Join Varianten gibts auch tausende andere Quellen im Netz.

Mangelnde SQL-Grundkenntnisse lassen dein geplantes Gameserver-Interface in keinem guten Licht da stehen. Da weiß man ja schon vorher, dass da grobe Fehler im Code als auch im DB-Design zu finden sein werden.
Allein die Tabellenbeschreibung aus dem ersten Post lassen nichts gutes erahnen. ;)

Vielleicht magst du dir auch mal die Normalformen anschauen und umsetzen.
 
Da steht alles schön beschrieben: http://en.wikipedia.org/wiki/Join_(SQL)
Zu den Join Varianten gibts auch tausende andere Quellen im Netz.
Danke werde ich mir mal anschauen =)

Mangelnde SQL-Grundkenntnisse lassen dein geplantes Gameserver-Interface in keinem guten Licht da stehen. Da weiß man ja schon vorher, dass da grobe Fehler im Code als auch im DB-Design zu finden sein werden.
Allein die Tabellenbeschreibung aus dem ersten Post lassen nichts gutes erahnen. ;)
Wie schön das es nicht geplant ist sondern bereits Produktiv im Einsatz ist, desweiteren ist das Exklusiv für mich und nicht Öffentlich. Die Frage hier bezog sich nicht auf mein Webinterface sondern auf eine Klasse bzgl. GameServer Leih Script welches ich derzeit für einen Kunden erstelle.

Nur weil man mit JOIN nicht unbedingt viel anzufangen weiß, muss man ja nicht gleich von der Materie keine Ahnung haben oder? Immerhin habe ich schon einige Dinge hinbekommen wie XML-API Schreiben, Game / Voice Server Interfaces, AJAX Features, Klassen mit PDO Statements etc. aber nun gut, das kann ja wirklich jeder...

Wie schön übrigens dass du anhand von 2 Spalten je Tabelle auf mein Layout etc. schließen kannst. Selbstverständlich hat loan_server eine ID Spalte mit AI und PK wie sich das gehört, desweiteren gebe ich z.B. bei Servername keine Text Spalte an sondern ein VARCHAR mit 50 Zeichen. Indizes werden dann auch noch verfasst, wenn das ganze komplett steht.

Vielleicht magst du dir auch mal die Normalformen anschauen und umsetzen.
Mein Datenbank Layout ist doch sehr Sinnvoll gehalten. Es werden die Daten gespeichert welche der Kunde wünscht. Das Feld max_slots ist z.B. ziemlich Sinnvoll um die Überlastung eines Hosts zu vermeiden. Es ist auch effektiv bei loan_server die machineID anzugeben statt die Login Daten für eine andere Maschine komplett dort einzufügen.

Aber nunja, du scheinst natürlich Perfekt zu sein was solche Dinge angeht...
Ich Scripte ja nicht nur in PHP mit MySQL sondern auch in Perl, Bash, Batch etc. Ich kann einige viele Dinge, vlt. nicht Perfekt aber soweit ziemlich gut. Immerhin hat es in gut 5 Jahren Internet Zeit keiner geschafft meine Dedicated Server oder Websites zu hacken, daher kann ich ja gar nicht so Mies in den Sachen sein!
 
Warum gehst du gleich an die Decke, wenn jemand Kritik übt?

Du erstellst hier in letzter Zeit viele Themen, bei denen andere Dann deine Probleme lösen. Dafür opfern sie ihre Freizeit und das auch noch kostenlos.

Du schreibst, du codest für einen Kunden. Warum müssen wir dann die Arbeit machen, für die du bezahlt wirst?

Die Aussage, dass du dich mit so vielen Skriptsprachen auskennst, kommt einen komisch vor, wenn man so etwas lesen darf:
Inwiefern meinst du das Terrorkarotte? Es muss ja nicht unbedingt immer so sein das die Dateien mit .cfg enden etc.

Wenn dir jemand schreibt:
Bei einer solchen Sache schreit es förmlich nach dem Programm find mit Wildcards in Kombination mit einer Schleife.

Bei so ziemlich jeder Skriptsprache gibt es for und while loops, zu Deutsch auch Schleifen genannt. Das Programm find und dessen Parameter, bzw. Möglichkeiten sollten für einen Bashskripter eigentlich keine Hürde sein.

Insgesamt kann so der Eindruck entstehen, dass du schon bei kleinen Problemen nicht mittels Google selber suchst, sondern hier die Problemchen schilderst, damit du dir den Code zusammenkopieren kannst.

Was du genau machst, wer weiß, aber durch die Art und Weise deines Auftretens kann halt dieser Eindruck entstehen.
 
Meine Frage in dem anderen Thread bzgl. "Inwiefern meinst du das Terrorkarotte? Es muss ja nicht unbedingt immer so sein das die Dateien mit .cfg enden etc." kam dadurch auf, das ich der Meinung war du hättest da vielleicht eine geniale Lösung.

Das ich nicht jede Datei die auf .cfg endet explizit irgendwo eintrage ist klar, wenn dann mache ich es mit *.cfg. Ich wollte eigentlich nicht wieder anfangen und mir die Dateien einzeln herauspicken, nun habe ich es aber doch gemacht:

Beispiel für CS (bisher habe ich hier kein Template angelegt, ich entferne einfach die Symlinks falls vorhanden.):
Code:
cp -R --remove-destination /home/$3/cstrike/maps/*.res /home/$1/$2/cstrike/maps
	cp -R --remove-destination /home/$3/cstrike/*.cfg /home/$1/$2/cstrike
	cp -R --remove-destination /home/$3/cstrike/*.txt /home/$1/$2/cstrike
	cp -R --remove-destination /home/$3/cstrike/liblist.gam /home/$1/$2/cstrike
Oder hast du dafür eine andere Lösung?

Lediglich die SQL Frage hier galt dem anderen Auftrag, der Rest gilt für mein eigenes Webinterface was ich für mich Persönlich erstelle und auch nicht veräußern werde, auch wird keiner meiner Codes in das andere Script überlaufen, es wird alles komplett neu und Exklusiv für den Kunden geschrieben.
 
Back
Top