[PHP/MySQL] Problem beim verarbeiten einer Abfrage

epic

De Puta Brot :D
ID: 49135
L
1 Mai 2006
155
3
Hi,

ich habe eine Funktion, die sich getPrice nennt und welche aus der Datenbank einen Durchschnittspreis errechnet:

PHP:
        function getPrice($ArtikelID){

	$query = "SELECT SUM(Preis)/(SELECT SUM(Menge) FROM Angebot WHERE Artikel_ArtikelID = $ArtikelID) " .
			"FROM Angebot " .
			"WHERE Artikel_ArtikelID = $ArtikelID ;";
	$result = mysql_query($query);
	$avg = mysql_fetch_row($result);
	return $avg[0];
}

Diese Funktion möchte ich dann verwenden, um eine Preisliste zu erstellen. Die Preisliste wird durch die Funktion showList erstellt, welche wie folgt aussieht:

PHP:
      function showList() {

        // DB ABfrage
            $abfrage = "SELECT * FROM Artikel ORDER BY Brand";
            $ergebnis = mysql_query($abfrage);

            // erstelle Tabellenheader

            echo '<table border="1">';
            echo "<tr>";
            echo 	"<th>ID</th>";
            echo 	"<th>Brand</th>";
            echo 	"<th>Bezeichnung</th>";
            echo 	"<th>Preis</th>";
            echo "</tr>";

            // erstelle Preisliste

            while($row = mysql_fetch_object($ergebnis)) {

                echo "<tr>";
                echo "<td>$row->ArtikelID";
                $ArtikelID = $row->ArtikelID;
                echo "<td>$row->Brand";
                echo "<td>$row->Bezeichnung";
                echo "<td>$row->getPrice($ArtikelID)";
                echo "</tr>";

            }

            echo '</table>';
            return $row->ArtikelID;
             $row->Brand;
             $row->Bezeichnung;
             $row->getPrice($ArtikelID);
        }

Bis auf den Preis funktioniert eigentlich alles. Es wird eine Tabelle erstellt, welche die richtige ArtikelID mit dem richtigen Produkt (inkl. Bezeichnung) ausgibt, jedoch im Preisfeld steht die ArtikelID als Zahl (1) zB anstatt des errechneten Preises :S

Kann mir da jemand weiterhelfen bitte?
 
AVG()

Greetz

paddya

Edit: Natürlich lässt sich das alles in einer Query erledigen:

PHP:
SELECT *, AVG((preis / menge)) FROM Artikel  GROUP BY ArtikelID ORDER BY Brand
 
Zuletzt bearbeitet:
Danke für deine Hilfe, jedoch macht deine Abfrage ganz etwas anderes als ich eigentlich möchte.

Der Input für die Funktion ist eine ArtikelID und dann soll anhand der ArtikelID aus der Angebotstabelle ein Durchschnittspreis erstellt werden, der sich aus allen Preisen, die dort für den Artikel eingetragen sind errechnet
 
Zuletzt bearbeitet:
Danke für deine Hilfe, jedoch macht deine Abfrage ganz etwas anderes als ich eigentlich möchte.

Der Input für die Funktion ist eine ArtikelID und dann soll anhand der ArtikelID aus der Angebotstabelle ein Durchschnittspreis erstellt werden, der sich aus allen Preisen, die dort für den Artikel eingetragen sind errechnet

Du brauchst deine Funktion dann nicht mehr ;) Außerdem war deine Variante eh unperformant, da das Ganze n (Zahl der Datensätze) + 1 Queries erzeugt. Mit meiner Variante hast du genau eine Query.

Greetz

paddya
 
PHP:
SELECT *, AVG((preis / menge)) FROM Artikel ORDER BY Brand GROUP BY ArtikelID

Fehler

SQL-Befehl: Dokumentation

SELECT * , AVG( (
preis / menge
) )
FROM Artikel
ORDER BY Brand
GROUP BY ArtikelID
LIMIT 0 , 30

MySQL meldet: Dokumentation
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'GROUP BY ArtikelID
LIMIT 0, 30' at line 1

leider nicht :(
 
Vertausche GROUP- und ORDER-Clause ;)

PHP:
SELECT *, AVG((preis / menge)) FROM Artikel  GROUP BY ArtikelID ORDER BY Brand
 
Ah... wir sind in der falschen Tabelle.

PHP:
SELECT *, (SELECT AVG((preis / menge)) FROM Angebot WHERE Artikel.ArtikelID = Angebot.ArtikelID GROUP BY Angebot.ArtikelID) AS avg FROM Artikel  ORDER BY Brand

Edit: Performance dürfte allerdings grottig sein, um das mal drastisch auszudrücken ;)

Greetz

paddya
 
du solltest dir überlegen eine Summary-Tabelle anzulegen, denn bei jedem Seitenaufruf den Durchschnittspreis zu erstellen ...
  1. ... kostet sehr viel Last
  2. ... ändern sich die Werte eher selten (im Verhältnis Änderungen/Seitenaufrufe)

In die Summary-Tabelle dann gleich aggregiert deine Werte schreiben, also folgendermaßen:
ArtikelId|Verkäufe|Preis (summiert)
1|15|1457.14€
2|1|2.50€
3|10|99€
 
Vielen Dank für die zahlreichen Antworten und eure Hilfe!

Um das mit der Performance kümmer ich mich später, so funktioniert es jetzt:

PHP:
SELECT SUM(Preis)/(SELECT count(artikel_ArtikelID) FROM Angebot WHERE Artikel_ArtikelID = $ArtikelID) 
			FROM Angebot
			WHERE Artikel_ArtikelID = $ArtikelID ;

Mir wäre wichtig, wie ich das nun mal ausgebe

PHP:
      function showList() {

        // DB ABfrage
            $abfrage = "SELECT * FROM Artikel ORDER BY Brand";
            $ergebnis = mysql_query($abfrage);

            // erstelle Tabellenheader

            echo '<table border="1">';
            echo "<tr>";
            echo     "<th>ID</th>";
            echo     "<th>Brand</th>";
            echo     "<th>Bezeichnung</th>";
            echo     "<th>Preis</th>";
            echo "</tr>";

            // erstelle Preisliste

            while($row = mysql_fetch_object($ergebnis)) {

                echo "<tr>";
                echo "<td>$row->ArtikelID";
                $ArtikelID = $row->ArtikelID;
                echo "<td>$row->Brand";
                echo "<td>$row->Bezeichnung";
                echo "<td>$row->getPrice($ArtikelID)";
                echo "</tr>";

            }

            echo '</table>';
            return $row->ArtikelID;
             $row->Brand;
             $row->Bezeichnung;
             $row->getPrice($ArtikelID);
        }

tuts nämlich nicht :( Erhalte immer nur die ArtikelID in Klammern (1) anstatt dem Preis.
 
PHP:
      function showList() {

        // DB ABfrage
            $abfrage = "SELECT * FROM Artikel ORDER BY Brand";
            $ergebnis = mysql_query($abfrage);

            // erstelle Tabellenheader

            echo '<table border="1">';
            echo "<tr>";
            echo     "<th>ID</th>";
            echo     "<th>Brand</th>";
            echo     "<th>Bezeichnung</th>";
            echo     "<th>Preis</th>";
            echo "</tr>";

            // erstelle Preisliste

            while($row = mysql_fetch_object($ergebnis)) {

                echo "<tr>";
                echo "<td>$row->ArtikelID";
                $ArtikelID = $row->ArtikelID;
                echo "<td>$row->Brand";
                echo "<td>$row->Bezeichnung";
                echo "<td>$row->getPrice($ArtikelID)";
                echo "</tr>";

            }

            echo '</table>';
            return $row->ArtikelID;
             $row->Brand;
             $row->Bezeichnung;
             $row->getPrice($ArtikelID);
        }

tuts nämlich nicht :( Erhalte immer nur die ArtikelID in Klammern (1) anstatt dem Preis.

$row ist ein Objekt, das die Spalten und Daten des aktuell durchlaufenen Datensatzes abbildet. Deshalb hat das Objekt auch keine Methode getPrice, auf die du offensichtlich zugreifst...

Greetz

paddya
 
habs nun gelöst..

PHP:
            // erstelle Preisliste

            while($row = mysql_fetch_object($ergebnis)) {

                echo "<tr>";
                echo "<td>$row->ArtikelID";
                $ArtikelID = $row->ArtikelID;
                echo "<td>$row->Brand";
                echo "<td>$row->Bezeichnung";
                echo "<td>";
                echo getPrice($ArtikelID);
                echo "</tr>";

            }

            echo '</table>';
            return $row->ArtikelID;
             $row->Brand;
             $row->Bezeichnung;
             getPrice($ArtikelID);
        }

Werde jetzt mal an der Optimierung der Performance arbeiten! Danke an alle Helfer!