Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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!

Geschrieben

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)

Geschrieben
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 '%%'

 

Geschrieben

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...)

Geschrieben

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

Geschrieben
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

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...