chrisfah
Goto Top

Mysql Abfrage aus 3 Tabellen

Hallo, ich versuche bereits seit Stunden ein Problemchen zu lösen. Leider steh ich auf der Leitung....

Ich habe eine Mysql (V5.1) Abfrage aus 2 Tabellen:
Hier die verkürzte Version:

$obj_q_r = "SELECT p.p_id, p.p_titeltext, p.plz, p.ort,   
					o.o_id, o.projekt_id, o.einiges_andere_noch 
					FROM ".TABLE_OBJEKTE." o, ".TABLE_PROJEKTE." p   
					WHERE o.projekt_id = '".$p_id."'   
					AND p.p_id = '".$p_id."'   
					ORDER BY o.o_id ASC";  
Zu jedem der Ergebnisse möchte ich eine weitere Abfrage machen, die aus einer dritten Tabelle die Anzahl der Einträge mit einer bestimmten id zählt wobei egal ist, ob das Ergebnis Null 0 ist oder nicht. Die einzelne Abfrage, die ich zu jedem einzelnen Ergebnis machen müsste wäre so:
while ($result = mysql_fetch ......) {
   $query = "SELECT COUNT(k_id) as zaehler   
                     FROM TABELLE_KONTAKTE k  
                     WHERE k.objekt_id = '".$result['o_id']."' ";  
}

Gibt es nun eine Möglichkeit, diese beiden queries zu einer einzigen zusammenzufassen ???
Leider hab ich schon einiges probiert (Left Join ...), leider kein Erfolg...

Lg und Danke im Voraus, Chris

Content-ID: 164036

Url: https://administrator.de/forum/mysql-abfrage-aus-3-tabellen-164036.html

Ausgedruckt am: 25.12.2024 um 20:12 Uhr

Biber
Biber 06.04.2011 um 01:07:04 Uhr
Goto Top
Moin ChrisFah,

versuch es mal so:
$obj_q_r = "SELECT p.p_id, p.p_titeltext, p.plz, p.ort,   
         o.o_id, o.projekt_id, o.einiges_andere_noch,
         k.zaehler 
        FROM ".TABLE_OBJEKTE." o, ".TABLE_PROJEKTE." p,  
             (SELECT k_id, Count(k_id) as zaehler FROM TABELLE.KONTAKTE
               group by k_id) k 
	WHERE o.projekt_id = '".$p_id."'   
	AND p.p_id = o.projekt_id
        AND k.k_id = o.o_id
	ORDER BY o.o_id ASC";  
[ungetestet]

Grüße
Biber
ChrisFah2
ChrisFah2 06.04.2011 um 20:36:07 Uhr
Goto Top
Hallo,
DANKE für die rasche Antwort. Leider nicht ganz befriedigend:

Es wird zwar korrekt gezählt, abeer nur jene Objekte ausgewählt, die auch in der Tabelle kKontakte einen Eintrag haben. Es sollte aber so sein, das alle vorhandenen Objekte gelistet werden, auch wenn kein Kontakt Eintrag da ist. Wo Kontakt einträge da sind, sollen sie für das betreffende Objekt zusammengezählt werden....

Hier nochmal meine derzeitige query:
$obj_q_r = "SELECT p.p_id, p.p_titeltext, p.plz, p.ort,   
					o.o_id, o.projekt_id, o.o_name, o.immobilie, o.erwerb, o.o_titeltext, o.undvielesmehr, 
					k.zaehler   
					FROM ".TABLE_OBJEKTE." o, ".TABLE_PROJEKTE." p,   
					(SELECT objekt_id, COUNT(k_id) as zaehler FROM ".TABLE_KONTAKTE." group by objekt_id) k    
					WHERE o.projekt_id = '".$p_id."'   
					AND p.p_id = '".$p_id."'   
					AND k.objekt_id = o.o_id 
					ORDER BY o.o_id ASC";  

???
Wie kann ich das lösen ???

Lg, Chris
Biber
Biber 06.04.2011 um 20:59:20 Uhr
Goto Top
Moin ChrisFah und ChrisFah2, ihr beiden,

sorry, ihr hattet zwar den LEFT JOIN erwähnt, aber den hab ich verdrängt.

Dann so in etwa:

$obj_q_r = "SELECT p.p_id, p.p_titeltext, p.plz, p.ort,   
	   o.o_id, o.projekt_id, o.o_name, o.immobilie, o.erwerb,
           o.o_titeltext,o.undvielesmehr, 
	  IfNull(k.zaehler, 0)   
	FROM ".TABLE_OBJEKTE." o left join  
	(SELECT objekt_id, COUNT(k_id) as zaehler 
              FROM ".TABLE_KONTAKTE." group by objekt_id) k   
              ON o.o_id =k.objekt_id ,
             ".TABLE_PROJEKTE." p,   
		WHERE o.projekt_id = '".$p_id."'   
		AND p.p_id = '".$p_id."'   
		AND k.objekt_id = o.o_id 
		ORDER BY o.o_id ASC";  

Aus dem INNER JOIN ist ein LEFT JOIN von Tabelle o [Objekte] auf die Tabelle [AggregierteKontakte] k geworden,
zusätzlich ist in der SELECT-Feldliste aus dem Feld "k.zaehler" ein "IFNull(k.zaehler, 0)" geworden.
--> FALLS bei mySQL ein Count(NULL) auch NULL ergibt, wie ich vermute.
--> Das kann ich nicht prüfen jetzt. Ist alles ungetestet.


Aus der WHERE-Bedingung kann das "o.o_id=k.objekt_id" rausfliegen.

Grüße
Biber
ChrisFah2
ChrisFah2 06.04.2011 um 21:28:38 Uhr
Goto Top
Hallo again,

der ChrisFah2 ist noch aus "alter" Zeit, als ich meinen Userlogin vergessen hatte und nun loggt mich der FF automatisch damit ein. Egal ... face-sad

Also:

Leider auch nicht ganz, es werden auch nur jene Datensätze angezeigt, die auch in den Kontakten angeführt sind.

Aber ich lass es gut sein, der zeitaufwand steht nicht dafür. Ich mach eine weitere query im loop durch die erste query und gut is.

Trotzdem vielen Dank für deine Mühe und die nächtlichen Antworten!!!!
Lg, Chris
Biber
Biber 06.04.2011 um 21:42:51 Uhr
Goto Top
Moin Chris,

okay, ich besteh ja gar nicht drauf, dass es im zweiten Versuch klappt...;-9

Aber:
Ich hab gerade gesehen, dass ich fälschlicherweise in dem Statement oben immer noch das "AND k.objekt_id = o.o_id " in der WHERE-Bedingung stehen habe.
(einfach übersehen).

Damit werden natürlich nach wie vor auch nur die angezeigt, die...<bla>... wie von dir beschrieben.
Machst du bitte noch einen Test mit ohne diese Zeile?

Grüße
Biber
ChrisFah2
ChrisFah2 06.04.2011 um 22:37:36 Uhr
Goto Top
HEUREKA !!!
Hallo, jetzt werden alle Ergebnisse gelistet, wie es sein soll, jedoch mit dem key im Array hat es was :
Hier der Key , der eigentlich zaehler
[IfNull(k.zaehler, 0)] => 1
Die Werte stimmen jedoch.

Habe es nun so gelöst, hoffe es stimmt so (hier die ganze query):
$obj_q_r = "SELECT p.p_id, p.p_titeltext, p.plz, p.ort,   
					o.o_id, o.projekt_id, o.o_name, o.immobilie, o.erwerb, o.o_titeltext, o.verkauft, o.nutzflaeche, o.gesamtflaeche, 
					o.zimmer, o.grund, o.stockwerk, o.keller, o.keller_txt, o.garage, o.stellplaetze, o.heizung, o.heizung_txt, 
					o.bauweise, o.bauweise_txt, o.energiekz, o.ausstattung, o.preis, o.preis_ab, o.preis_bis, o.preis_schl, 
					o.mietpreis_netto, o.betriebskosten, o.mietpreis_total, o.mindestgebot, o.vadium, o.verkehrswert, o.fertig_m, 
					o.fertig_y, o.kurzbeschreibung, o.pic0,  
	  				IfNull(k.zaehler, 0) as zaehler     
					FROM ".TABLE_OBJEKTE." o left join  
					(SELECT objekt_id, COUNT(DISTINCT interessenten_id)  as zaehler
     		         FROM ".TABLE_KONTAKTE." group by objekt_id) k     
      		        ON o.o_id =k.objekt_id , 
      		       ".TABLE_PROJEKTE." p   
					WHERE o.projekt_id = '".$p_id."'   
					AND p.p_id = '".$p_id."'   
					AND p.p_status = '1'   
					AND p.p_system_status = '1'   
					AND o.o_status = '1'   
					AND o.o_system_status = '1'   
					ORDER BY o.o_id ASC";  
Das Problem mit dem key habe ich durch
IfNull(k.zaehler, 0) as zaehler 
gelöst.
Kannst bitte nochmal drüberschaun, daß die beiden "as zaehler" nicht überschreiben ...

Danke, lg, Chris