mmofacts.com

Queryhilfe

gepostet vor 18 Jahre, 11 Monate von The_Alien
Habe mir folgendes gebastelt:

$data=query("SELECT fleets.userid,SUM(fleets.count)*ships.points AS fpoints FROM ships,fleets,users WHERE ships.id=fleets.shiptype AND fleets.userid=users.id GROUP BY fleets.userid;");

while ($row=mysql_fetch_array($data))
query("UPDATE `users` SET users.score_fleet=".$row['fpoints']." WHERE users.id=".$row['userid']." LIMIT 1;");

Weil ich das irgendwie nicht als ein Query hinbekomme. Soll nichts anderes machen wie die gesamten Flottenpunkte eines Users zu berechnen und diese dann eintragen. Wenn ich das über die Schleife mache kommen da aber ettliche Querys zusammen aber ich habe es nicht hinbekommen das als ein Query zu machen. Auch mit Subselects komme ich nicht weiter. Hat da jemand eine Idee?
gepostet vor 18 Jahre, 11 Monate von knalli
Was bedeutet denn

SUM(fleets.count)*

gepostet vor 18 Jahre, 11 Monate von Kampfhoernchen
das * steht für Multiplikation:

leerschritte und Klammern erhöhen die Lesbarkeit drastisch.

Ich würde folgendes verwenden:
 

$sql =
"REPLACE DELAYED INTO `users` (users.id, score_fleet) VALUES";
while ($row=mysql_fetch_array($data)){
$sql.= "(".$row['userid'].",
".$row['fpoints']."
),";
}


Für Erklärung guckst du hier und für das Delayed hier
gepostet vor 18 Jahre, 11 Monate von Krisch
Ungetestet:
$data = query(

"UPDATE `users`
LEFT JOIN fleets ON users.id = fleets.userid
LEFT JOIN ships ON fleets.shiptype = ships.id
SET user.score_fleet = SUM(fleets.count * ships.points);");
gepostet vor 18 Jahre, 11 Monate von Klaus
$data = query(

"UPDATE `users`
LEFT JOIN fleets ON users.id = fleets.userid
LEFT JOIN ships ON fleets.shiptype = ships.id
SET user.score_fleet = SUM(fleets.count) * ships.points;");

wollte er afaik haben.

Könnte aber das Problem geben wie bei meinen "Minen". SUM() ist im Update nicht zulässig.
gepostet vor 18 Jahre, 11 Monate von Krisch
Original von Klaus
wollte er afaik haben.

Glaub ich nicht, da hat er für alle Schiffe dieselbe Punktezahl.
Aber wenn SUM nicht geht ..

Kampfhoernchens Lösung funktioniert wahrscheinlich, aber finde ich nicht ganz so sauber wegen dem Replace.
gepostet vor 18 Jahre, 11 Monate von Klaus
mit sub selects müsste auch noch gehen, erfordert nur ein gewisses maß an "einarbeitung".
Sicherlich wäre das noch schneller als der weg zurück zu php.
gepostet vor 18 Jahre, 11 Monate von sammy
Hallo,

passend zum Thema, ich habe gerade auch ein Brett vor dem Kopf.
Folgende Aufgabenstellung

Tabelle mit den Feldern:
timestamp, userid, id, numbervalue...

Nun möchte ich ein Update auf die Tabelle machen
numbervalue=numbervalue-1
für den kleinsten timestamp-Wert
je userid

kriegt man das in ein Statement unter?
gepostet vor 18 Jahre, 11 Monate von Krisch
sammy, du bist raus.

$data = query(

"UPDATE `users`
SET users.score_fleet =
(SELECT SUM(fleets.count * ships.points)
FROM fleets
LEFT JOIN ships ON fleets.shiptype = ships.id
WHERE fleets.userid = users.id);");
Falls Subqueries erlaubt sind.
gepostet vor 18 Jahre, 11 Monate von sammy
@kirsch
warum bin ich raus?
das Codestatement was du grad gepostet hat bringt bei mir nicht gerade viel...


@Fornax
hm, mit dem begrenzen auf einen Wert versuche ich mal.
gepostet vor 18 Jahre, 11 Monate von sammy
Original von Fornax
UPDATE tabelle SET numbervalue=numbervalue-1 ORDER BY timestamp  LIMIT 1


So irgenwie würde mir jetzt einfallen.

Guck mal bei
dev.mysql.com/doc/refman/5.0/en/update.html, da findest du estimmt was


hi,
habe das gerade mal ausprobiert, wuerde allerdings nur pro userid dann funktionieren. Wenn ich das so umbaue, das er alle findet (mehrere verschachtelte Selects....) wuerde es vermutlich gehen, aber extremst unperformant... zumindest war es das mal als ich sowas mal bei einem Kunden gemacht habe ;-)
gepostet vor 18 Jahre, 11 Monate von Krisch
Original von sammy
@kirsch
warum bin ich raus?

1. Weil du bei einem Thema, wo das Problem noch nicht gelöst wurde, mit deinem Problem daherkommst statt ein eigenes Thema zu erstellen.
2. Weil du meinen Namen falsch gelesen / geschrieben hast.

Und jetzt zurück zum Thema (und zwar nicht zu deinem).
gepostet vor 18 Jahre, 11 Monate von sammy
Original von Krisch
Original von sammy
@kirsch
warum bin ich raus?

1. Weil du bei einem Thema, wo das Problem noch nicht gelöst wurde, mit deinem Problem daherkommst statt ein eigenes Thema zu erstellen.
2. Weil du meinen Namen falsch gelesen / geschrieben hast.

Und jetzt zurück zum Thema (und zwar nicht zu deinem).

1. die Thematik ist an sich aehnlich. Man
2. deinen Namen habe ich erst spaeter falsch gelesen, nachdem ich raus war
gepostet vor 18 Jahre, 11 Monate von The_Alien
Das mit den Subselects habe ich schon probiert aber das haut auch nicht ganz hin weil die Subselects mehrere Spalten zurück liefert aber bei einem solchen Queryaufbau nur ein Wert zurück gegeben werden darf. Denn in dem Subselect wird wiederrum die ganze Tabelle angegeben.

Replace kann ich nicht nehmen da in dieser Tabelle noch andere wert sind die dann überschrieben werden. und ein REPLACE mit addition bzw daten aus derselbigen Tabelle geht leider nicht (zb "REPLACE `users`SET `count`=`count`+1 WHERE `id`=3" - da die spalte erst gelöscht wird und dann geschrieben ist der count immer 1 egal was da vorher stand. Würde mir sonst viel arbeit im allgemeinen sparen)

Aber bevor ich mich da noch länger mit rumärgere belasse ich es wohl bei einer Schleife. Gibt dann zwar einmal am Tag einige Querys aber nun ja - mache ich das halt nachts über einen Cron.

Zu Sammy - wenn du in jeder Jpalte einen Wert erhöhen willst einfach so machen. Das andere konnt nicht auf eine ganze Tabelle funktionieren weil dort ein LIMIT 1 angegeben war welches dafür steht nur eine Spalte zu machen. Oder hast du mehrere Spalten zum auswerten etc? Mehr Infos wären da von Vorteil.

UPDATE tabelle SET numbervalue=numbervalue-1 

gepostet vor 18 Jahre, 11 Monate von The_Alien
Aber mal andere Frage - sind bei UPDATE überhaupt GROUP BY erlaubt?
Ich bekomme immer Fehler wenn ich GROUP BY in einem UPDATE benutze oder muß man da auf was spezielles achten?
gepostet vor 18 Jahre, 11 Monate von sammy
Original von The_Alien

Zu Sammy - wenn du in jeder Jpalte einen Wert erhöhen willst einfach so machen. Das andere konnt nicht auf eine ganze Tabelle funktionieren weil dort ein LIMIT 1 angegeben war welches dafür steht nur eine Spalte zu machen. Oder hast du mehrere Spalten zum auswerten etc? Mehr Infos wären da von Vorteil.

UPDATE tabelle SET numbervalue=numbervalue-1 



Hi The Alien,

ja, so waere das natuerlich einfach. Das Problem ist nur, das ich nicht alle Updaten will, sondern nur bestimmte, und zwar die, die in einer bestimmten Gruppierung nach Datum sortiert die ältesten sind...
gepostet vor 18 Jahre, 11 Monate von The_Alien
Dann muß du halt noch ein GROUP BY und ein ORDER BY einfügen aber ohne mehr spaltenangaben kann ich dir da auch kein Query erstellen.

Auf diese Diskussion antworten