Mysql - Anzahl an Datensätzen in umfangreicher Abfrage ermitteln
Daniel Petratsch
- datenbank
Hallo!
Ich möchte die DB-Zugriffe optimieren und so viele Abfragen wie nur möglich in einer zusammenfassen. Mein aktuelles Problem betrifft eine Blätterfunktion, die die Ausgabe limitiert und ich aber trotzdem alle Datensätze brauche um die Blätter-Links berechnen zu können:
Da einige Tabellen betroffen sind, hoffe ich dass es auch ohne der Darstellung der Struktur geht, würde gerne wissen ob es grundsätzlich möglich ist in folgender Abfrage _ALLE_ betroffenen Datensätze (ohne Berücksichtigung von LIMIT) auszulesen:
//----------------------------------->
SELECT
a.id,
count( a.id ) AS anzahl_ergebnisse,
a.ueberschrift,
a.preis,
a.wohnflaeche,
a.grundflaeche,
a.zimmer,
b.bezeichnung AS bezirk,
c.bezeichnung AS objekttyp,
c.id AS id_objekttyp,
d.pfad AS bildpfad
FROM objekt AS a
INNER JOIN bezirk AS b ON ( a.id_bezirk = b.id )
INNER JOIN objekttyp AS c ON ( a.id_objekttyp = c.id )
LEFT JOIN bild AS d ON ( a.id = d.id_objekt )
WHERE a.sichtbarkeit =1
AND a.gueltig_bis >= NOW( )
AND (
ISNULL(
d.pfad
)
OR d.sort = (
SELECT MIN( d2.sort )
FROM bild AS d2
WHERE a.id = d2.id_objekt )
)
AND (
a.id_bezirk =1
OR a.id_bezirk =2
OR a.id_bezirk =3
OR a.id_bezirk =4
OR a.id_bezirk =5
OR a.id_bezirk =6
OR a.id_bezirk =7
OR a.id_bezirk =8
OR a.id_bezirk =9
OR a.id_bezirk =10
)
AND (
a.id_objekttyp =1
OR a.id_objekttyp =2
OR a.id_objekttyp =3
OR a.id_objekttyp =4
OR a.id_objekttyp =5
OR a.id_objekttyp =6
OR a.id_objekttyp =7
OR a.id_objekttyp =8
OR a.id_objekttyp =9
OR a.id_objekttyp =10
OR a.id_objekttyp =11
)
AND (
a.preis >= "500"
AND a.preis <= "400000"
)
AND (
(
a.wohnflaeche >= "0"
AND a.wohnflaeche <= "500"
)
OR (
a.grundflaeche >= "0"
AND a.grundflaeche <= "500"
)
)
GROUP BY a.id
ORDER BY a.letzte_verlaengerung DESC
LIMIT 0 , 30
//----------------------------------->
Hier bekomme ich logischerweise pro Datensatz ein COUNT() von 1 zurück, da sich diese Funktion ja auf einen Tupel bezieht, ich würde gerne die Gesamtzahl aller gefundenen Datensätze in einer eigenen Spalte anhängen, ist das generell irgendwie möglich? Wenn nicht, muss ich nur für die Zählfunktion eine fast identische Abfrage definieren und die Performance wäre nahezu halbiert.
Vielen Dank und freundliche Grüße,
Daniel
echo $begrüßung;
Ich möchte die DB-Zugriffe optimieren und so viele Abfragen wie nur möglich in einer zusammenfassen.
Das muss nicht in jedem Fall sinnvoll sein. Damit erhöht sich möglicherweise unnötig die Komplexität der Abfrage und des auswertenden Scripts.
Mein aktuelles Problem betrifft eine Blätterfunktion, die die Ausgabe limitiert und ich aber trotzdem alle Datensätze brauche um die Blätter-Links berechnen zu können:
Dazu baut man das Schlüsselwort SQL_CALC_FOUND_ROWS in die limitierte Abfrage ein und schickt eine zweite Abfrage SELECT FOUND_ROWS(); hinterher.
echo "$verabschiedung $name";
Hi Dedlfix,
Ich möchte die DB-Zugriffe optimieren und so viele Abfragen wie nur möglich in einer zusammenfassen.
Das muss nicht in jedem Fall sinnvoll sein. Damit erhöht sich möglicherweise unnötig die Komplexität der Abfrage und des auswertenden Scripts.
Ja da hast du natürlich vollkommen recht - Zusammenfassen nur dann wenns auch wirklich sinnvoll ist und nicht dadurch noch komplexer wird.
Mein aktuelles Problem betrifft eine Blätterfunktion, die die Ausgabe limitiert und ich aber trotzdem alle Datensätze brauche um die Blätter-Links berechnen zu können:
Dazu baut man das Schlüsselwort SQL_CALC_FOUND_ROWS in die limitierte Abfrage ein und schickt eine zweite Abfrage SELECT FOUND_ROWS(); hinterher.
Vielen Dank für den Hinweis, diese Funktion war mir bis dato noch nicht bekannt. Es wird leider auch eine weitere Abfrage benötigt, die offizielle Mysql Quelle schreibt aber von Performance-Vorteilen, in diversen Internet-Foren wird diese Funktion als nur unmerklich schneller diskutiert - wie auch immer, auf jeden Fall wird das Script dadurch übersichtlicher und das ist ja auch schon ein Vorteil :)
Vielen Dank und liebe Grüße,
Daniel