AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken UPDATE Statement vereinfachen
Thema durchsuchen
Ansicht
Themen-Optionen

UPDATE Statement vereinfachen

Ein Thema von Angel4585 · begonnen am 24. Aug 2008 · letzter Beitrag vom 24. Aug 2008
Antwort Antwort
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#1

UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 08:40
Datenbank: MySQL • Version: 5 • Zugriff über: PHP
Hallo,

ich programmiere zur Zeit ein Browsergame, genauer einen Fussballmanager.

Aktuell möchte ich die Berechnungen des Trainings machen.
Ich hab das jetzt alles in ein SQL-UPDATE Statement gepackt:

SQL-Code:
update players as p1 SET
    p1.skill1=p1.skill1*(select t1skill1 from team_training where team=p1.team),
    p1.skill2=p1.skill2*(select t1skill2 from team_training where team=p1.team),
    p1.skill3=p1.skill3*(select t1skill3 from team_training where team=p1.team),
    p1.skill4=p1.skill4*(select t1skill4 from team_training where team=p1.team),
    p1.skill5=p1.skill5*(select t1skill5 from team_training where team=p1.team),
    p1.skill6=p1.skill6*(select t1skill6 from team_training where team=p1.team)
where p1.team>'0'
Ich hab die zwar nochnicht getestet, aber die müsste wohl so aussehen.
Was mir nicht gefällt sind die 6 subselects.
Kann ich in nem Update nicht diese andere Tabelle joinen? Es geht immerhin um knapp 40.000 DS ind er Tabelle players und knapp 4.000 in der tabelle team_training

Edit:

Mir iss grad eingefallen das bei den Spielern das Team nicht direkt dabei steht
Vereinfach habe ich das auch, mit einem Join:

SQL-Code:
update players as p1 left outer join player_contracts as c1 on c1.player=p1.id and c1.ende=0 left outer join team_training as t1 on t1.team=c1.team SET
   p1.skill1=p1.skill1*t1.t1skill1,
   p1.skill2=p1.skill2*t1.t1skill2,
   p1.skill3=p1.skill3*t1.t1skill3,
   p1.skill4=p1.skill4*t1.t1skill4,
   p1.skill5=p1.skill5*t1.t1skill5,
   p1.skill6=p1.skill6*t1.t1skill6
Ich habe ds ausgeführt und es funktioniert zumindest mal..
Allerdings hat das nach 5 Minuten gerademal 7.000 Datensätze durch, das ist viel zu langsam das muss doch schneller gehen
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#2

Re: UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 14:33
Kennt MySQL überhaupt Foreign Keys? Mein phpMyAdmin zeigt mir keine an, sagt mir aber gleichzeitig dass er dieses Statement ausführen konnte:

 ALTER TABLE player_contracts ADD CONSTRAINT fk_player_contract_player_t FOREIGN KEY ( player ) REFERENCES players( id )
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#3

Re: UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 16:09
Das kommt darauf an. Wenn es sich um MyISAM handelt, werden evtl. keine ForeignKeys unterstützt (zumindest war das früher mal so). Bei InnoDB sieht das anders aus. Um aber Dein Kernproblem besser zu verstehen, müsste man die DB-Struktur kennen. Mir kommt es jedenfalls komisch vor, dass Spaltenwerte mit Spaltenwerten aus anderen Tabellen multipliziert werden sollen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#4

Re: UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 16:16
Das iss schon richtig so mit dem Multiplizieren oder auch addieren(bin da noch am rumprobieren )von Spaltenwerten.
Das ganze stellt ein Teamtraining dar bei dem sich die Werte der Spieler verändern.
Multiplizieren ist da evtl tatsächlich nicht korrekt aber zumindest addieren wäre dann das richtige.

Ich hab jetz manuell einen Index über die Spalten gemacht und jetzt geht es tatsächlich in 2 Sekunden glatt durch

Ich hab den Tabellentyp auch mal in InnoDB geändert aber kann keinen Unterschied erkennen, ich sehe im phpMyAdmin nirgends auch nur einen Hinweis das es da Foreign Keys gibt.
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
omata

Registriert seit: 26. Aug 2004
Ort: Nebel auf Amrum
3.154 Beiträge
 
Delphi 7 Enterprise
 
#5

Re: UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 16:22
sorry, das ich was gesagt habe...
  Mit Zitat antworten Zitat
NormanNG

Registriert seit: 1. Feb 2006
294 Beiträge
 
Delphi 2007 Professional
 
#6

Re: UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 16:43
Hi,

@omata
Was ja auch nichts anderes ist als eine "schöner" formatierte Variante
des von Angel4585 formuliten Update...

Der richtige Ansatz ist wohl tatsächlich, - neben einer passenden Abfrage -
geeignete Indizes zu verwenden.
Gruß
Norman
  Mit Zitat antworten Zitat
Angel4585

Registriert seit: 4. Okt 2005
Ort: i.d.N.v. Freiburg im Breisgau
2.199 Beiträge
 
Delphi 2010 Professional
 
#7

Re: UPDATE Statement vereinfachen

  Alt 24. Aug 2008, 17:11
jo scheinbar wurden die indizes beim anlegen nicht erstellt, hab sie manuell nachgetragen un jetz gehts problem los
Martin Weber
Ich bin ein Rüsselmops
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:25 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz