Veröffentlicht 20. August 200421 j Das ist mein SQL-Befehl: SELECT DISTINCT objekt. * FROM objekt, objektet AS et, objektvks AS vks, objektinf AS inf WHERE ( ( objekt.id = et.o_id AND et.sperre = '0' ) OR ( objekt.id = vks.o_id AND vks.sperre = '0' ) OR ( objekt.id = inf.o_id AND inf.sperre = '0' ) ) AND objekt.strasse LIKE '%%' AND objekt.plz LIKE '%%' AND objekt.ort LIKE '%%' LIMIT 0 , 20 Meine Frage dazu, kann ich irgendwie in diesen SQL ein Feld einbauen, welches mir die Anzahl aller gefundenen Datensätze aus 'objekt' zurückliefert, als wäre das 'LIMIT' nicht vorhanden? Ich hoffe ihr versteht was ich meine! Das Limit habe ich um eine Pager-Funktion zu realisieren! Ich möchte nicht umbedingt eine zweite Abfrage machen nur um herauszufinden, wieviele Datensätze gefunden werden!
20. August 200421 j Welche MySQL Version hast Du? Warum machst Du folgendes? objekt.strasse LIKE '%%' AND objekt.plz LIKE '%%' AND objekt.ort LIKE '%%' Damit wählst Du doch alle Datensätze aus. Das kannst Du dir doch sparen. Frank
20. August 200421 j was genau heißt denn das LIMIT 0, 20 heißt das das man min. 0 Ergebnisse haben möchte und 20 maximal ? mfg byte
20. August 200421 j heißt das das man min. 0 Ergebnisse haben möchte und 20 maximal ? Nein, das man 20 Datensätze ab dem 0. (1.) Datensatz haben will. LIMIT 20,20 würde dann die nächsten 20 Datensätze liefern (Datensatz 21-40)
21. August 200421 j Autor Welche MySQL Version hast Du? Warum machst Du folgendes? Damit wählst Du doch alle Datensätze aus. Das kannst Du dir doch sparen. Frank Version hab ich jetzt nicht im Kopf - aber zumindest eine der Neuesten. Das LIKE "%%" mache ich weil in das Statement geleichzeitig eine Suche eingebunden ist. Da keine Suchbegriffe eingegeben wurden, sucht er nach allen! Mein Problem ist trotzdem ein anderes! Kann ich in diesem SQL-Statement irgendwie eine Möglichkeit schaffen, die Anzahl aller Datensätze mit den Suchkriterien zu finden oder muss ich dafür ein neues Statement absetzen, welches einfach alle Datensätze ausliest? So wie folgendes: SELECT DISTINCT count(*) AS found FROM objekt, objektet AS et, objektvks AS vks, objektinf AS inf WHERE ( ( objekt.id = et.o_id AND et.sperre = '0' ) OR ( objekt.id = vks.o_id AND vks.sperre = '0' ) OR ( objekt.id = inf.o_id AND inf.sperre = '0' ) ) AND objekt.strasse LIKE '%%' AND objekt.plz LIKE '%%' AND objekt.ort LIKE '%%'
21. August 200421 j Ab Version 4.1 sind zwar Subquerys möglich aber nicht so wie Du sie brauchst. http://dev.mysql.com/doc/mysql/en/Subqueries.html Du mußt wohl ein zweites Statement machen. Frank
23. August 200421 j SELECT DISTINCT objekt.*, 0 CNT FROM objekt, objektet et, objektvks vks, objektinf inf WHERE ( ( objekt.id = et.o_id AND et.sperre = '0' ) OR ( objekt.id = vks.o_id AND vks.sperre = '0' ) OR ( objekt.id = inf.o_id AND inf.sperre = '0' ) ) AND objekt.strasse LIKE '%%' AND objekt.plz LIKE '%%' AND objekt.ort LIKE '%%' LIMIT 0 , 20 UNION SELECT 99999 objekt.id, 9999 et.o_id, '0' et.sperre [hier muss jedes Feld, das du oben angibst (SELECT *) auch angegeben werden, nur halt mit einem Wert vorbelegt] DISTINCT count(objekt.id) CNT FROM objekt, objektet et, objektvks vks, objektinf inf WHERE ( ( objekt.id = et.o_id AND et.sperre = '0' ) OR ( objekt.id = vks.o_id AND vks.sperre = '0' ) OR ( objekt.id = inf.o_id AND inf.sperre = '0' ) ) AND objekt.strasse LIKE '%%' AND objekt.plz LIKE '%%' AND objekt.ort LIKE '%%' Damit hast du das ganze in einer Abfrage. Nach deiner eigentlichen Abfrage (erweitert um ein weitertes Feld: CNT) führst du hier eine 2te Abfrage aus, deren Ergebnis an das der ersten Abfrage angehängt wird. Dazu müssen dieselben Felder in beiden Abfragen vorkommen. Im letzten Satz des Ergebnisses hast du dann die Anzahl. Ob das jetzt wirklich eine sinnvolle Lösung ist kann ich nicht beurteilen. Kommt darauf an wie du das ganze verwenden willst. Du müsstest nach der Abfrage also erstmal zum letzen Satz gehen, die Anzahl auslesen und den Satz dann löschen. Dann könntest du mit dem Ergebniss danach ganz normal weitermachen. Vielleicht hilft dir das ja irgendwie... Edit: das "AS" kannst du weglassen um die Spalten im Ergebniss umzubenennem oder den Tabellen in der Abfrage Namen zu geben. Ich hab mal gehört, mit "AS" wäre das für den Server etwas aufwendiger als ohne. (durch "AS" würde wohl irgendwie was im Speicher neu angelegt werden oder so...)
23. August 200421 j Autor Ist zwar ne Lösung - aber es wäre mir lieber wenn ich das Feld CNT in jeder Zeile habe - etwa so: |Feld 1|Feld 2|CNT |xxxxxx|xxxxxx|50 |xxxxxx|xxxxxx|50 |xxxxxx|xxxxxx|50 |xxxxxx|xxxxxx|50 |xxxxxx|xxxxxx|50 |xxxxxx|xxxxxx|50 |xxxxxx|xxxxxx|50 Ist sowas nicht irgendwie möglich? Ich schleife das Feld dann zwar in jeder Zeile mit - das wäre mir aber egal. auf dieses eine Feld kommt es mir auch nicht an - aber ein Statement wäre in meinem Quellcode wesentlich übersichtlicher und ich hätte halt einen DB-Zugriff weniger. Trotzdem danke
24. August 200421 j Ist zwar ne Lösung - aber es wäre mir lieber wenn ich das Feld CNT in jeder Zeile habe - etwa so: select ID, (select count(ID) from test.testdaten2) CNT from test.testdaten2 so funktioniert es mit DB/2, aber bei MySQL bringt er immer einen Fehler... EDIT: Ausserdem führt er so die Count-Abfrage sehr oft (unter Umständen) durch (für jeden Datensatz eben 1 mal). Mit der UNION Lösung macht er das eben nur 1 mal am Ende. Nochmal Edit: Mit Variablen geht es SELECT @CNT:=COUNT(ID) FROM HERSTELLER; SELECT ID, @CNT FROM HERSTELLER Das im MySQLControlCenter liefert das von dir gewünschte Ergebnis MySQL supports user variables as of version 3.23.6. You can store a value in a user variable and refer to it later, which allows you to pass values from one statement to another. http://dev.mysql.com/doc/mysql/en/Variables.html :marine
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.