Seite 2 von 3

Verfasst: 16.11.2003 20:18
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.

Verfasst: 16.11.2003 21:00
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

Verfasst: 17.11.2003 01:42
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.

Verfasst: 17.11.2003 11:13
von PhilippK
Dein Problem liegt wohl hier:

Code: Alles auswählen

      $sql7 = "UPDATE tab2 SET tab2.punkte = 'XY' WHERE XY";
Gruß, Philipp

Verfasst: 17.11.2003 12:21
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.

Verfasst: 17.11.2003 13:46
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.

Verfasst: 18.11.2003 01:32
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.

Verfasst: 18.11.2003 09:29
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

Verfasst: 18.11.2003 13:26
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 ?

Verfasst: 18.11.2003 17:20
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