Verschachtelte selects ?

Liebe Gemeinde,

Die Datenbank : ( mit Wohnungsangeboten )

id ortsteil_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
05 Bockum Stadtweg 48.00
06 Bockum Stadtweg 49.00

Mit der nachfolgenden Abfrage lese ich den AVG ( kalt_qm) für die Wohnungen aus, deren Preis > 0 ist, das klappt auch wunderbar, Nachdem ich auf MYSQL 5.0 umgestellt habe. Nun möchte ich in der Ausgabe auch die Werte haben, die

a) die Gesamtanzahl der Wohnungsangebote darstellen
b) und die Anzahl der Angebote, die nur qm abbilden

Die Abfrage an sich muss nur entsprechend geändert werden. Auch das klappt, für sich gesehen. Nur möchte ich die Ausgabe der Werte so darstellen, daß sie mit der untenstehenden Ausgabe in einer Zeile stehen. Mir gelingt es derzeit nur, die unter a) und b) beschriebenen SELECTS entweder darüber oder darunter auszugeben, da ich nicht weiss, wie ich das verschachteln muss, damit es mit den anderen Werten einzeilig wird.

Vielleicht hat jemand einen Tipp?

$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 tbl) m "
WHERE kalt_qm_1 > 0 "
." 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 } ?>

Hallo

Erst mal eine Frage vornweg:

Wenn du in deiner Tabelle folgende drei Einträge hast

01 Bockum Dorfweg 51.00 3
02 Bockum Dorfweg 51.00 3
03 Bockum Dorfweg 51.00 6

dann erhältst du Dank DISTINCT als Ergebnis von AVG( m.kalt_qm_1 ) die Zahl 4.5 und nicht 4. Ist das so gewollt?

Wenn ja, dann könnte es so gehen:

SELECT m.ortsteil\_1, m.qm\_1, (

 SELECT AVG( m2.kalt\_qm\_1 )
 FROM (

 SELECT DISTINCT ortsteil\_1, qm\_1, kalt\_qm\_1
 FROM miete
 WHERE miete.kalt\_qm\_1 \>0
 ) m2
 WHERE m2.ortsteil\_1 = m.ortsteil\_1
 AND m2.qm\_1 = m.qm\_1
) `avg` , (

 SELECT COUNT( \* )
 FROM miete
 WHERE miete.ortsteil\_1 = m.ortsteil\_1
 AND miete.qm\_1 = m.qm\_1
) `count` , (

 SELECT COUNT( \* )
 FROM miete
 WHERE miete.ortsteil\_1 = m.ortsteil\_1
 AND miete.qm\_1 = m.qm\_1
 AND miete.kalt\_qm\_1 =0
) `count(0)`
FROM (

 SELECT DISTINCT ortsteil\_1, qm\_1
 FROM miete
) m

Oder, falls du statt Unterabfragen lieber Joins magst:

SELECT \*
FROM (

 SELECT m.ortsteil\_1, m.qm\_1, AVG( m.kalt\_qm\_1 ) `avg`
 FROM (

 SELECT DISTINCT ortsteil\_1, qm\_1, kalt\_qm\_1
 FROM miete
 )m
 WHERE kalt\_qm\_1 \>0
 GROUP BY m.ortsteil\_1, m.qm\_1
) m1
NATURAL RIGHT JOIN (

 SELECT ortsteil\_1, qm\_1, COUNT( \* ) `count`
 FROM miete
 GROUP BY ortsteil\_1, qm\_1
) m2
NATURAL LEFT JOIN (

 SELECT ortsteil\_1, qm\_1, COUNT( \* ) `count(0)`
 FROM miete
 WHERE kalt\_qm\_1 =0
 GROUP BY ortsteil\_1, qm\_1
) m3

Ich hab mal testweise die beiden Abfragen mit deinen sechs Datensätzen laufen lassen, die erste Variante hat 0.0018 s gebraucht, die zweite 0.0028 s. Ich könnte mir aber vorstellen, dass bei großen Datenmengen die zweite Variante schneller ist.

Alternativ kann man natürlich auch drei einzelne Abfragen absetzen und die dann in PHP zusammenbauen.

Gruß, sigterm

Hallo sig,

Vielen Dank !!! Ich habe es probiert. Läuft.

Viele Grüße , TIM