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:
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:
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
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";
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 164036
Url: https://administrator.de/contentid/164036
Ausgedruckt am: 22.11.2024 um 04:11 Uhr
6 Kommentare
Neuester Kommentar
Moin ChrisFah,
versuch es mal so:
[ungetestet]
Grüße
Biber
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";
Grüße
Biber
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:
???
Wie kann ich das lösen ???
Lg, Chris
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
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:
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
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
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 ...
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
der ChrisFah2 ist noch aus "alter" Zeit, als ich meinen Userlogin vergessen hatte und nun loggt mich der FF automatisch damit ein. Egal ...
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
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
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
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):
Das Problem mit dem key habe ich durch
gelöst.
Kannst bitte nochmal drüberschaun, daß die beiden "as zaehler" nicht überschreiben ...
Danke, lg, Chris
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";
IfNull(k.zaehler, 0) as zaehler
Kannst bitte nochmal drüberschaun, daß die beiden "as zaehler" nicht überschreiben ...
Danke, lg, Chris