AVG aus selectierten Datensätzen ( distinct )

Liebe Gemeinde,

auch über die Feiertage plagt mich ein kleines Problem. Die Verbindung einer select Abfrage mit distinct und der AVG Ermittlung einer Spalte.

Die Datenbank : ( mit Wohnungsangeboten )

id orstteil_1 strasse_1 qm_1 kalt_qm_1

01 Bockum Dorfweg 51.00 3.63
02 Bockum Dorfweg 51.00 3.63
03 Bockum Dorfweg 51.00 3.63
04 Bockum Stadtweg 51.00 4.65

Ziel der Abfrage soll es sein, den durchschnittlichen qm - Preis Kaltmiete zu ermitteln. Und zwar nach dem tatsächlich vorhandenen Wohnraum, nicht nach der Häufigkeit der Wohnungsangebote.

nach Angebotslage würde sich ein AVG(kalt_qm_1) von 3.885 € / qm für den Bezirk Bockum in der Größe 51.00 qm ergeben. Das Ergebnis muss aber sein (3.63 + 4.65 )/2 = 4.14 €

Das ist eine sehr schlichte Abfrage, trifft aber nicht das Problem, da diese jede Wohnung zählt. Und die Durchschnittsermittlung sich nicht auf den tatsächlichen Wohnraum bezieht. ( Wohnung 01 - 03 ist ein und die selbe. Ich habe es mit select distinct versucht, aber es ist schwieriger als erwartet.

$query_1 = mysql_query(„select ortsteil_1,qm_1,AVG(kalt_qm_1)AS dkalt_1 FROM wohnungsliste where qm_1= ‚$reg_qm_1‘ AND kalt_qm_1 > ‚0‘ GROUP BY ortsteil_1,qm_1 order by $ortsteil_1 asc“);

$reg_qm_1 ist die übergebene Variable aus dem Drop Down Feld.

Vielleicht hat jemand irgendwann einen Lösungsansatz. Würde mich freuen.

Frohes Fest, Tim

Guten Morgen,

eine Frage hätte ich zu Anfang: Kann es sein das wir uns in der falschen Topic befinden? Das gehört doch eher zu Datenbanken :wink:

Die Lösung ist übrigens sehr einfach, ich bin eigentlich auch mehr durch Zufall drauf gestoßen als ich nach AVG und DISTINCT gesucht habe:

Und zwar lautet die Syntax der Methode AVG([DISTINCT] expr), also einfach AVG(DISTINCT kalt_qm_1) nehmen, habs selber nochmal ausprobiert und es funktioniert.

Dir auch ein Frohes Fest
Grüße

Guten Morgen,

danke für die Antwort. Ich habe es jetzt mal probiert.

$query_1 = mysql_query(„select ortsteil_1,qm_1,AVG(DISTINCT kalt_qm_1)AS dkalt_1 FROM wohnungsliste where qm_1= ‚$reg_qm_1‘ AND kalt_qm_1 > ‚0‘ GROUP BY ortsteil_1,qm_1 order by ortsteil_1 asc“)or die (mysql_error());

Ich bekomme jetzt gar nichts angezeigt. Ich suche mal weiter. Vielleicht habe ich noch irgendwas übersehen.

Trotzdem danke,

Gruß Tim

Hey,

komische Sache… Ich hab die Tabelle bei mir erstellt und mit dem Select

SELECT ortsteil_1, qm_1, AVG( DISTINCT kalt_qm_1 ) AS dkalt_1
FROM distinct_miete
WHERE qm_1 = ‚51‘
AND kalt_qm_1 > ‚0‘
GROUP BY ortsteil_1, qm_1
ORDER BY ortsteil_1 ASC
LIMIT 0 , 30

gibt er mir immer noch das passende Ergebnis aus. Das einzige was ich noch verändert habe ist, dass ich die Variable $reg_qm_1 durch ‚51‘ ersetzt habe. Kann es vielleicht am Datentyp oder an der Variable liegen? Und welche MySQL-Version benutzt du? Die Methode AVG([DISTINCT] var) ist nämlich erst seit MySQL 5.0.3 verfügbar, hab ich grade nochmal nachgeschaut =)

Grüße

Hallöle,

vielen Dank für Deine Hilfe. Ich habe MySQL 4.0. Ich vermute, daran liegt es, wie von Dir beschrieben. (5.0.3)

Gruß, Tim

Hey hey,

mir würde jetzt nur noch ein ausrechnen mithilfe von PHP einfallen wenn du SQL nicht updaten kannst, vll kann man das ganze mithilfe eines Joines lösen, nur war das noch nie meine Stärke…

Falls du eine Lösung findest würde ich mich freuen wenn du sie hier postest =)

Grüße

Hallo,

momentan versuche ich es so : mit alias für Spalten und Abfrage

$query = mysql_query(„SELECT m.ortsteil_1,m.qm_1,AVG(m.kalt_qm_1)
FROM (SELECT distinct ortsteil_1,qm_1 FROM wohnungsliste) m
GROUP BY m.ortsteil_1,m.qm_1“)or die (mysql_error());

Geht aber auch nicht. Jedenfalls nicht so wie es da steht, es kommt eine Syntax Fehlermeldung: …near select distinct…

Tja, mal schauen.

Gruß, Tim

Hey,

versuchs mal mit

SELECT m.ortsteil_1, m.qm_1, AVG( m.kalt_qm_1 )
FROM ( SELECT DISTINCT ortsteil_1, qm_1, kalt_qm_1 FROM wohnungsliste ) m
GROUP BY m.ortsteil_1, m.qm_1

Du kannst nicht etwas aus einem Select holen was garnicht da ist, in diesem Fall war es „kalt_qm_1“ das du im zweiten select nicht mit angegeben hast. Bei mir funktionierts wieder, bin mal gespannt =)

Grüße

Hi, danke für den Tipp.

genauso hab ich es geschrieben, auch was die Anführungszeichen betrifft.

$query= mysql_query ("SELECT m.ortsteil_1, m.qm_1, AVG( m.kalt_qm_1 )
FROM ( SELECT DISTINCT ortsteil_1, qm_1, kalt_qm_1
FROM wohnungsliste ) m
GROUP BY m.ortsteil_1, m.qm_1 ")or die (mysql_error());

Syntax Error : near select distinct…

Unabhängig davon . Wie genau ( ich habe mehrere Varianten probiert ), sieht die Ausgabe aus ?

ich mache s so :

$query= mysql_query ("SELECT m.ortsteil_1, m.qm_1, AVG( m.kalt_qm_1 )
FROM ( SELECT DISTINCT ortsteil_1, qm_1, kalt_qm_1
FROM wohnungsliste ) m
GROUP BY m.ortsteil_1, m.qm_1 ")or die (mysql_error());

$counter = 0;
while ($ausgabe = mysql_fetch_array($query))

{

$counter++;
?>
echo ‚‘.$counter.’’;?>
echo ‚‘.$ausgabe[‚m.ortsteil_1‘].’’;?>
echo ‚‘.$ausgabe[‚m.qm_1‘].’’;?>
echo’’. number_format($ausgabe[‚m.kalt_qm_1‘],2,".",".") .’’;?>

}?>
Ich habe die Ausgaben mal mit m. und mal ohne versucht. Nur ? wie soll ich in beiden Fällen den AVG Wert darstellen ? Einen AS… gibt es ja nicht.

Grüße, Tim

Hey,

ich hoffe nicht das dein Quelltext wirklich so aussieht :stuck_out_tongue: Um es kurz zu machen, benutz mal bitte folgenden Code, musst nur noch die connect-daten ergänzen und sag mir dann bitte was rauskommt:

blubb
<?php $dbhost = '';
$dbuser = ''; $dbpass = ''; $conn = mysql\_connect($dbhost, $dbuser, $dbpass) OR DIE('Error connecting to mysql'); mysql\_select\_db(''); $query = mysql\_query( " SELECT m.ortsteil\_1, m.qm\_1, AVG( m.kalt\_qm\_1 ) " ." FROM (SELECT DISTINCT ortsteil\_1, qm\_1, kalt\_qm\_1 FROM wohnungsliste) m " ." GROUP BY m.ortsteil\_1, m.qm\_1" ) OR DIE( mysql\_error() ); $counter = 0; while ($ausgabe = mysql\_fetch\_array($query)) { $counter++; ?\> <?php echo $counter; ?> <?php echo $ausgabe[0]; ?> <?php echo $ausgabe[1]; ?> <?php echo number_format($ausgabe[2],2,".","."); ?> <?php } ?>

Falls ich deine Frage zu der Ausgabe des Durchschnitts richtig verstanden habe - die einfachste Methode ist das standardmäßige aufrufen eines Arrays wie in meinem Quellcode oben. Dabei gibt die Reihenfolge der Tabellenspalten im Select auch die Reihenfolge im Array an. Du kannst aber auch über den SQL-Befehl „AS“ Aliase vergeben welche dann hinterher verwendet werden können. So könntest du dir zb durch AVG(kalt_qm_1) AS durchschnitt den Inhalt mit echo $ausgabe[‚durchschnitt‘]; ausgeben lassen.

Falls es immer noch Fehler gibt dreh ich langsam ab, dann KANN es nur noch an der Datenbank oder nem winzigen, leich übersehbaren Fehler liegen :smiley: könntest du mir dann bitte einen Export der Tabelle „wohnungsliste“ incl Inserts und den kompletten Quelltext schicken?

Bei mir kommt übrigens „1 Bockum 51.00 4.14“ raus…

Grüße

Guten Morgen,

zunächst möchte ich mich ganz herzlich für Deine viele Arbeit bedanken, die Du hier für mich investierst. Ich habe nun Deine Abfrage vollständig übernommen – mit allen Änderungen, und es kommt, was wir nun schon kennen:
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 'SELECT DISTINCT ortsteil_1, qm_1, kalt_qm_1 FROM wohnungsliste)
Alle anderen Abfragen in meinem kleinen Projekt funktionieren, sind aber auch nicht so kompliziert wie eben diese hier. Das einzige, was mir dazu noch einfällt, daß MYSQL 4.0 das nicht hergibt, was ich aber so richtig nicht glauben kann. Ich weiß es nicht.

Bis dahin erst mal , viele Grüße, Tim

Hallole,

ich habe jetzt mal eigens für die Abfrage eine Tabelle angelegt ( wohnungsliste_1 ) und diese mit den angegebenen Spalten und Werten befüllt. Also den vier Einträgen, die ich Anfangs gepostet habe. Um so nicht auf meine Riesentabelle zugreifen zu müssen.

Die Meldung ist dieselbe. SYNTAX…

Nun weiß ich nicht mehr. Also : erst mal noch ein herzliches Dankeschön,

Viele Grüße, Tim