Krain Geschrieben 20. August 2004 Geschrieben 20. August 2004 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! Zitieren
robotto7831a Geschrieben 20. August 2004 Geschrieben 20. August 2004 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 Zitieren
ByteRix Geschrieben 20. August 2004 Geschrieben 20. August 2004 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 Zitieren
Wolle Geschrieben 20. August 2004 Geschrieben 20. August 2004 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) Zitieren
Krain Geschrieben 21. August 2004 Autor Geschrieben 21. August 2004 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 '%%' Zitieren
robotto7831a Geschrieben 21. August 2004 Geschrieben 21. August 2004 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 Zitieren
Krain Geschrieben 21. August 2004 Autor Geschrieben 21. August 2004 Gut- Danke - das wollte ich wissen! Zitieren
geloescht_JesterDay Geschrieben 23. August 2004 Geschrieben 23. August 2004 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...) Zitieren
Krain Geschrieben 23. August 2004 Autor Geschrieben 23. August 2004 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 Zitieren
geloescht_JesterDay Geschrieben 24. August 2004 Geschrieben 24. August 2004 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 Zitieren
Krain Geschrieben 25. August 2004 Autor Geschrieben 25. August 2004 Nutze hier lieber joins. Hab es schon auf JOIN umgebaut- Danke! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.