Problem mit Schleifen ! Kann jemand helfen ?

Fragen zu allen Themen rund ums Programmieren außerhalb von phpBB können hier gestellt werden - auch zu anderen Programmiersprachen oder Software wie Webservern und Editoren.
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Ich muss ja updaten da in der tab1 ja weitere datensätze also spielbegegnungen gespeichert werden und somit neue Punkte zusammen gezählt werden, welche auch in der tab2 wieder geupdate werden müssen.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

http://www.mysql.com/doc/en/UPDATE.html hat geschrieben:Starting with MySQL Version 4.0.4, you can also perform UPDATE operations that cover multiple tables:

Code: Alles auswählen

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;
Da du aber den alten Wert immer überschreibst, könnte das hier auch nützlich sein: http://www.mysql.com/doc/en/REPLACE.html
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Hi Leute,
also ich bekomme das Script einfach nicht zu laufen, egal was ich mache. Mein Probescript sieht jetzt so aus:

Code: Alles auswählen

<? include('open.inc3.php'); ?>
<?
$sql = 'SELECT * FROM tab1, tab2';
$result = mysql_query($sql, $conn);

if ($result)
{
   $number = mysql_num_rows($result);
   echo '<P>Es sind ';
   echo $number;
   echo ' Datensätze gelesen worden.</p>';
   echo '<TABLE BORDER="0">';
   while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

      // Tore A
      
      $sql2 = 'UPDATE tab1 SET punkte_a = \'';
      if ($row['tore_a'] > $row['tore_b'])
      {
      $sql2 .= '3';
      }
      elseif ($row['tore_a'] < $row['tore_b'])
      {
      $sql2 .= '0';
      }
      else
      {
      $sql2 .= '1';
      }
      $sql2 .= '\' WHERE spiel_id = ' . $row['spiel_id'];
      $result2 = mysql_query($sql2, $conn);
      
      // Tore B

      $sql3 = 'UPDATE tab1 SET punkte_b = \'';
      if ($row['tore_a'] > $row['tore_b'])
      {
      $sql3 .= '0';
      }
      elseif ($row['tore_a'] < $row['tore_b'])
      {
      $sql3 .= '3';
      }
      else
      {
      $sql3 .= '1';
      }
      $sql3 .= '\' WHERE spiel_id = ' . $row['spiel_id'];
      echo "<P>Abfrage 1: <pre>$sql3</pre>";
      $result3 = mysql_query($sql3, $conn);
      
      // Berechnung Punkte

      $sql8 = "SELECT sum(if(team_a_id='$row[team_a_id]', punkte_a, punkte_b)) FROM tab1 WHERE team_a_id='$row[team_a_id]' OR team_b_id='$row[team_a_id]'";
      echo "<P>Abfrage 2: <pre>$sql8</pre>";
      $result8 = mysql_query($sql8, $conn);

      // Update Punkte

      $sql7 = "UPDATE tab2 SET tab2.punkte = 'XY' WHERE XY";
      echo "<P>Abfrage letzte: <pre>$sql7</pre>";
      $result7 = mysql_query($sql7, $conn);

      //

      if ($result8) {
      $number = mysql_num_rows($result8);
      echo "<TABLE BORDER=0>";
      while ($row = mysql_fetch_array($result8, MYSQL_ASSOC)) {

      echo "<TR><TD>";
      echo implode("<TD>",$row);
      echo "</TR>";
      }
      echo "</TABLE>";

} else {
   echo "<P>".mysql_error($conn);
}
   }

}
else
{
   echo '<p>' . mysql_error($conn) . '</p>';
}
mysql_close($conn);
?>
Meine tab1 sieht so aus:

Code: Alles auswählen

| spiel_id | team_a_id | team_b_id | tore_a | tore_b | punkte_a | punkte_b | 
---------------------------------------------------------------------------- 
|    1     |     1     |     2     |   3    |    1   |    3     |    0     | 
|    2     |     2     |     4     |   2    |    3   |    0     |    3     | 
|    3     |     3     |     1     |   2    |    2   |    1     |    1     | 
Und meine tab2 sieht so aus:

Code: Alles auswählen

| team_id | tore | punkte | 
--------------------------- 
|    1    |      |        | 
|    2    |      |        | 
|    3    |      |        |
|    4    |      |        |
Die Punkte werden alle richtig berechnet und alles funktioniert, bis auf das reinschreiben in die tab2. Die ja jetzt so
aussehen sollte:

Code: Alles auswählen

| team_id | tore | punkte | 
--------------------------- 
|    1    |      |    4   | 
|    2    |      |    0   |
|    3    |      |    1   |
|    4    |      |    3   |
Ich schaue schon in meine PHP Bücher aber ich kriege es wirklich nicht hin. Kann mir jemand von euch sagen was ich in meinem
Script unter // Update Punkte oder auch wo anders schreiben muss, damit es die gewünschte Aktion ergibt ? Bitte helft mir,
ich werd noch ganz bescheurt wenn ichs schon nicht bin. Bitte, bitte helft mir.
PhilippK
Vorstand
Vorstand
Beiträge: 14662
Registriert: 13.08.2002 14:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von PhilippK »

Dein Problem liegt wohl hier:

Code: Alles auswählen

      $sql7 = "UPDATE tab2 SET tab2.punkte = 'XY' WHERE XY";
Gruß, Philipp
Kein Support per PN!
Der Sozialstaat ist [...] eine zivilisatorische Errungenschaft, auf die wir stolz sein können. Aber der Sozialstaat heutiger Prägung hat sich übernommen. Das ist bitter, aber wahr. (Horst Köhler)
Meine Mods
Gast

Beitrag von Gast »

Hallöchen,
ja da hast du recht. Aber ich weiss nicht wie ich das umschreiben soll oder was für Befehle in die UPDATE Anweisung rein gehören. Hast du da nicht einen tipp.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Code: Alles auswählen

REPLACE INTO tab2 (team_id, tore, punkte)
SELECT X, sum(if(team_a_id=X, punkte_a, punkte_b)), sum(if(team_a_id=X, tore_a, tore_b))
FROM tab1
WHERE team_a_id=X OR team_b_id=X
Vorraussetzung: team_id ist der Primärschlüssel.
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Hallo leute,
ich danke dir Pyramide. Das Probescript läuft bis jetzt so wie gewünscht, naja fast. Das Script sieht jetzt so aus:

Code: Alles auswählen

<? include('open.inc3.php'); ?>
<?
$sql = 'SELECT * FROM tab1, tab2';
$result = mysql_query($sql, $conn);

if ($result)
{
   $number = mysql_num_rows($result);
   while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {

      // Tore A
      
      $sql2 = 'UPDATE tab1 SET punkte_a = \'';
      if ($row['tore_a'] > $row['tore_b'])
      {
      $sql2 .= '3';
      }
      elseif ($row['tore_a'] < $row['tore_b'])
      {
      $sql2 .= '0';
      }
      else
      {
      $sql2 .= '1';
      }
      $sql2 .= '\' WHERE spiel_id = ' . $row['spiel_id'];
      $result2 = mysql_query($sql2, $conn);
      
      // Tore B

      $sql3 = 'UPDATE tab1 SET punkte_b = \'';
      if ($row['tore_a'] > $row['tore_b'])
      {
      $sql3 .= '0';
      }
      elseif ($row['tore_a'] < $row['tore_b'])
      {
      $sql3 .= '3';
      }
      else
      {
      $sql3 .= '1';
      }
      $sql3 .= '\' WHERE spiel_id = ' . $row['spiel_id'];
      $result3 = mysql_query($sql3, $conn);
      
      // Update + Berechnung Punkte und Tore
      
      $sql7 = "REPLACE INTO tab2 (team_id, punkte, tore) SELECT '$row[team_a_id]', sum(if(team_a_id='$row[team_a_id]', punkte_a, punkte_b)), sum(if(team_a_id='$row[team_a_id]', tore_a, tore_b)) FROM tab1 WHERE team_a_id='$row[team_a_id]' OR team_b_id='$row[team_a_id]'";
      $result7 = mysql_query($sql7, $conn);
}
}
else
{
   echo '<p>' . mysql_error($conn) . '</p>';
}
mysql_close($conn);
?>
<? include("open.inc3.php"); ?>
<?
$sql8 = "SELECT * FROM tab2, tab3 WHERE tab2.team_id = tab3.team_id";
      $result8 = mysql_query($sql8, $conn);
      if ($result8) {
      $number = mysql_num_rows($result8);
      echo "<P>Es sind $number Datensätze gelesen worden.";
      echo "<TABLE BORDER=1>";
      while ($row = mysql_fetch_array($result8, MYSQL_ASSOC)) {

      echo "<TR>";
      echo "<TD>",$row['ganz_name'];
      echo "<TD>",$row['tore'];
      echo "<TD>",$row['punkte'];
      echo "</TR>";
      }
   echo "</TABLE>";
} else {
   echo "<P>".mysql_error($conn);
}
mysql_close($conn);
?>
Sind da keine Fehler drin ? Das Script läuft ja. Danke nochmals. Aber eine Frage habe ich da noch. Ich habe jetzt in meine
tab2 hinter die team_id die Spalte spiele eingefügt. Dort sollen die Spiele eingefügt werden die jede Mannschaft
absolviert hat. Aber wie mache ich das ? Kann man das irgendwie in den Befehl, den du mir geschrieben hast, einbauen ?
Wenn ich eine neue SELECT Anweisung erstelle zählt er zwar die Spiele, aber nicht für jede einzelne Mannschaft sondern er
zählt alle zusammen. Also ich bekomme dann bei allen z.B eine 7. Was kann ich da tun ? Und nochmals vielen dank das du mir
soweit geholfen hast mit dem Script. Ciao.
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Du hast deine Tabellen aber nicht wirklich tab1,tab2,tab3 genannt, oder?

Wozu ist das hier?
Condor hat geschrieben:SELECT * FROM tab1, tab2

Code: Alles auswählen

      $sql2 = 'UPDATE tab1 SET punkte_a = \'';
      if ($row['tore_a'] > $row['tore_b'])
      {
      $sql2 .= '3';
      }
      elseif ($row['tore_a'] < $row['tore_b'])
      {
      $sql2 .= '0';
      }
      else
      {
      $sql2 .= '1';
      }
      $sql2 .= '\' WHERE spiel_id = ' . $row['spiel_id'];
      $result2 = mysql_query($sql2, $conn);
      
      // Tore B

      $sql3 = 'UPDATE tab1 SET punkte_b = \'';
      if ($row['tore_a'] > $row['tore_b'])
      {
      $sql3 .= '0';
      }
      elseif ($row['tore_a'] < $row['tore_b'])
      {
      $sql3 .= '3';
      }
      else
      {
      $sql3 .= '1';
      }
      $sql3 .= '\' WHERE spiel_id = ' . $row['spiel_id'];
      $result3 = mysql_query($sql3, $conn);
Lässt sich viel effizienter so realisieren:

Code: Alles auswählen

UPDATE tab1 SET punkte_a=3, punkte_b=0 WHERE tore_a>tore_b;
UPDATE tab1 SET punkte_a=0, punkte_b=3 WHERE tore_a<tore_b;
UPDATE tab1 SET punkte_a=1, punkte_b=1 WHERE tore_a=tore_b;
Wenn ich eine neue SELECT Anweisung erstelle zählt er zwar die Spiele, aber nicht für jede einzelne Mannschaft sondern er
zählt alle zusammen. Also ich bekomme dann bei allen z.B eine 7. Was kann ich da tun ?

Code: Alles auswählen

SELECT tab2.team_id, count(tab1.*) AS spiele
FROM tab2
LEFT JOIN tab1 ON (tab2.team_id = tab1.team_a_id OR tab2.team_id = tab1.team_b_id)
GROUP BY tab1.team_id
Condor
Mitglied
Beiträge: 221
Registriert: 27.02.2002 01:00
Wohnort: Ahlen

Beitrag von Condor »

Hallo,
wenn ich das hier eingebe:

Code: Alles auswählen

SELECT tab2.team_id, count(tab1.*) AS spiele FROM tab2 LEFT JOIN tab1 ON (tab2.team_id = tab1.team_a_id OR tab2.team_id = tab1.team_b_id) GROUP BY tab1.team_id";
Dann kommt diese Fehlermeldung:

Code: Alles auswählen

You have an error in your SQL syntax near '*) AS spiele FROM tab2 LEFT JOIN tab1 ON (tab2.team_id = tab1.team_a_id OR tab2.' at line 1
Was mache ich falsch ?
Benutzeravatar
Pyramide
Ehrenadmin
Beiträge: 12734
Registriert: 19.04.2001 02:00
Wohnort: Meschede

Beitrag von Pyramide »

Count funktioniert scheinbar nur mit Aliasen:

Code: Alles auswählen

SELECT t.team_id, count(s.spiel_id) AS anzahl_spiele
FROM teams t
LEFT JOIN spiele s ON (t.team_id = s.team_a_id OR t.team_id = s.team_b_id)
GROUP BY t.team_id
Antworten

Zurück zu „Coding & Technik“