Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   [MySQL] Problem mit COUNT (https://www.delphipraxis.net/64291-%5Bmysql%5D-problem-mit-count.html)

3_of_8 1. Mär 2006 19:16

Datenbank: MySQL • Zugriff über: PHP

[MySQL] Problem mit COUNT
 
Morgen.

Also, ich hab folgendes Problem:

Ich habe zwei Tabellen, users und ships. Ein Benutzer kann mehrere Schiffe haben. User und Ships haben jeweils eine id (mit autoincrement, ist primary). Ich will jetzt mit UPDATE oder so ähnlich bei jedem User den Wert des Feldes fleet eines Users auf die Anzahl der Schiffe setzen, die dem User gehören (also bei denen die ownerid gleich der userid des Users ist.)

alcaeus 1. Mär 2006 19:20

Re: [MySQL] Problem mit COUNT
 
z.B. so:
SQL-Code:
SELECT user_id, count(ship_id) FROM ships GROUP BY user_id
Sobald du alle Daten rausgeholt hast, laeufst du in einer Schleife ueber alle Zeilen hinweg, und updatest alle Benutzerschiffe. Zuerst solltest du den Count auf 0 setzen, und anschliessend auf die jeweilige Anzahl.

Greetz
alcaeus

3_of_8 1. Mär 2006 19:28

Re: [MySQL] Problem mit COUNT
 
Was verstehst du unter Benutzerschiffe? Ich glaube ich geb mal kurz die Struktur, damit wir nicht aneinander vorbeireden.

Tabelle users
userid INT(11) UNSIGNED
fleet INT UNSIGNED

Tabelle ships
shipid INT(11) UNSIGNED
ownerid INT(11) UNSIGNED

Wobei userid und shipid auch noch autoincrement und primary sind.

Ich will jetzt fleet bei jedem user auf die Anzahl der Schiffe setzen, die als ownerid die userid des jeweiligen Users haben. Meine momentane Abfrage sieht so aus, wird aber wohl nicht funzen:

UPDATE users u LEFT JOIN ships s ON (s.ownerid=u.userid) SET u.fleet=COUNT(s.*)

alcaeus 1. Mär 2006 19:35

Re: [MySQL] Problem mit COUNT
 
Erstmal alles auf 0 setzen:
Code:
// Erstmal alles auf 0
mysql_query('UPDATE users SET fleet = 0');
// Alle Schiffe zaehlen, gruppiert nach ownerid
$result = mysql_query('SELECT ownerid, count(shipid) as fleet FROM ships GROUP BY ownerid');
// In einer Schleife alle Ergebnisse durchlaufen und updaten
while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
  mysql_query('UPDATE users SET fleet = '. $row['fleet'] .' WHERE userid = '. $row['ownerid']);
}
Das ist ungetesteter Code, an dem du noch Hand anlegen musst; ich verwende immer nur ein DBAL fuer die Datenbank, und nehme selten die mysql_*-Funktionen *g*

Greetz
alcaeus

3_of_8 1. Mär 2006 19:41

Re: [MySQL] Problem mit COUNT
 
Die Idee hatte ich auch schon, aber ich dachte, man könnte das auch "in einem Rutsch" machen, so ähnlich wie ich oben.

mkinzler 1. Mär 2006 19:49

Re: [MySQL] Problem mit COUNT
 
Um Redundanzen zu vermeiden sollte auf das Feld Fleet in der Benutzerdatenbank verzichtet werden und die Anzahl bei Bedarf mit
SQL-Code:
mit SELECT ownerid, count(ship_id) FROM ships GROUP BY ownerid
ermittelt werden.

alcaeus 1. Mär 2006 19:58

Re: [MySQL] Problem mit COUNT
 
Naja, mach das mal wenn du 10000 User mit je 500 Schiffen hast, nur um ein Beispiel zu nennen: das Query laeuft ewig. Da ist es evtl. schon geschickter, die Anzahl zu "cachen" ;)

Greetz
alcaeus

mkinzler 1. Mär 2006 20:06

Re: [MySQL] Problem mit COUNT
 
Wenn die Tabellen richtig indiziert sind, dürfte das eigentlich kein Problem sein.

3_of_8 1. Mär 2006 20:19

Re: [MySQL] Problem mit COUNT
 
Moment... Redundanz... Was heißt das? Doppeldeutigkeit? :gruebel: Naja egal... Ich lass einfach mal meinen Code, der eh schon so ähnlich ist wie der von alcaeus. Danke @all.

mkinzler 1. Mär 2006 20:23

Re: [MySQL] Problem mit COUNT
 
Zitat:

Moment... Redundanz... Was heißt das? Doppeldeutigkeit?
Wenn ein sachverhalt mehrmals gespeichert ist. ( In deinem Fall explizit im Feld fleet und implizit durch die Anzahl der datensätze mit dem selben Fremschlussel ownerid)


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:48 Uhr.
Seite 1 von 2  1 2      

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