Discussion:
Nur gerade Ergebnisse mit MySQL abfragen
(zu alt für eine Antwort)
Daniel Schmidt
2009-08-06 23:40:16 UTC
Permalink
Hallo,

ich möchte nur gerade Ergebnisse mit MySQL abfragen. Also z.B. 2, 4, 6,
8, 10 Rows. Bei ungeraden Ergebnissen sollen dann nur die Geraden, also
eins weniger angezeigt werden. Ist soetwas mit MySQL möglich?

Grüße Daniel
Niels Braczek
2009-08-07 01:55:52 UTC
Permalink
Post by Daniel Schmidt
ich möchte nur gerade Ergebnisse mit MySQL abfragen. Also z.B. 2, 4, 6,
8, 10 Rows. Bei ungeraden Ergebnissen sollen dann nur die Geraden, also
eins weniger angezeigt werden. Ist soetwas mit MySQL möglich?
Ja.

MfG
Niels

PS: Für eine ausführlichere Antwort bedarf es mehr/genauere Informationen.
--
| http://www.kolleg.de · Das Portal der Kollegs in Deutschland |
| http://www.bsds.de · BSDS Braczek Software- und DatenSysteme |
| Webdesign · Webhosting · e-Commerce · Joomla! Content Management |
------------------------------------------------------------------
Claus Reibenstein
2009-08-07 06:00:34 UTC
Permalink
Post by Daniel Schmidt
ich möchte nur gerade Ergebnisse mit MySQL abfragen. Also z.B. 2, 4, 6,
8, 10 Rows. Bei ungeraden Ergebnissen sollen dann nur die Geraden, also
eins weniger angezeigt werden.
Ja, was denn nun? Willst Du nur gerade Ergebnisse abfragen, oder willst
Du alle Ergebnisse haben und auf gerade Werte abrunden?

Willst Du nur gerade Ergebnisse abfragen, musst Du filtern:

... WHERE ergebnis % 2 = 0;

Willst Du alle Ergebnisse haben und abrunden, musst Du rechnen:

SELECT ergebnis / 2 * 2 AS gerades_ergebnis ...

Dies klappt aber nur, wenn "ergebnis" ein ganzzahliger Datentyp ist.
Ansonsten musst Du auch noch casten:

SELECT CAST(ergebnis AS INT) / 2 * 2 ...

Gruß. Claus
Stefan+ (Stefan Froehlich)
2009-08-07 07:18:38 UTC
Permalink
Post by Claus Reibenstein
Post by Daniel Schmidt
ich möchte nur gerade Ergebnisse mit MySQL abfragen. Also z.B. 2, 4,
6, 8, 10 Rows. Bei ungeraden Ergebnissen sollen dann nur die
^^^^
Post by Claus Reibenstein
Post by Daniel Schmidt
Geraden, also eins weniger angezeigt werden.
Ja, was denn nun? Willst Du nur gerade Ergebnisse abfragen, oder
willst Du alle Ergebnisse haben und auf gerade Werte abrunden?
Es liest sich so, als wolle er eine gerade _Anzahl_ an Ergebnissen
haben - weshalb auch immer.

Servus,
Stefan
--
http://kontaktinser.at/ - die kostenlose Kontaktboerse fuer Oesterreich

Der Stein der Weisen, oder warum Stefan so meisterhaft verliebt!
(Sloganizer)
Daniel Schmidt
2009-08-08 13:29:11 UTC
Permalink
Post by Claus Reibenstein
Dies klappt aber nur, wenn "ergebnis" ein ganzzahliger Datentyp ist.
SELECT CAST(ergebnis AS INT) / 2 * 2 ...
You have an error in your SQL syntax. Check the manual that corresponds
to your MySQL server version for the right syntax to use near 'INT) DIV
2 * 2 FROM tabelle WHERE [...]

Mhmm, das mit dem casten will nicht recht funktionieren. Mache ich mit
meiner Abfrage etwas falsch oder liegt es an der Version?

Meine Abfrage:
==============

SELECT feld, CAST(feld AS INT) DIV 2 * 2 FROM tabelle WHERE [...]

"feld" ist dabei ein String (longtext)

MySQL-Version: 4.0.27-standard

Grüße Daniel
Claus Reibenstein
2009-08-08 15:13:40 UTC
Permalink
Post by Daniel Schmidt
Post by Claus Reibenstein
SELECT CAST(ergebnis AS INT) / 2 * 2 ...
You have an error in your SQL syntax. Check the manual that corresponds
to your MySQL server version for the right syntax to use near 'INT) DIV
Stimmt. INT geht an dieser Stelle nicht. Steht im Handbuch auch drin.
Post by Daniel Schmidt
MySQL-Version: 4.0.27-standard
http://dev.mysql.com/doc/refman/4.1/en/cast-functions.html

Gruß. Claus
Daniel Schmidt
2009-08-08 22:31:43 UTC
Permalink
Post by Claus Reibenstein
Stimmt. INT geht an dieser Stelle nicht. Steht im Handbuch auch drin.
Hat jemand eine andere Lösung?

MFG Daniel
Claus Reibenstein
2009-08-09 07:52:31 UTC
Permalink
Post by Daniel Schmidt
Post by Claus Reibenstein
Stimmt. INT geht an dieser Stelle nicht. Steht im Handbuch auch drin.
Hat jemand eine andere Lösung?
Sag mal, bist Du so blöd oder tust Du nur so? Ich habe Dir doch schon
den Link genannt, wo Du Deine Lösung findest! Wie wäre es denn, wenn Du
dies zur Abwechslung auch mal LESEN würdest?

Gruß. Claus
Daniel Schmidt
2009-08-09 11:55:37 UTC
Permalink
Post by Claus Reibenstein
Sag mal, bist Du so blöd oder tust Du nur so? Ich habe Dir doch schon
den Link genannt, wo Du Deine Lösung findest! Wie wäre es denn, wenn Du
dies zur Abwechslung auch mal LESEN würdest?
ich *habe* deinen Link gelesen und die Manual so gedeutet, dass INT
nicht von CAST unterstützt wird. Da ich INT offensichtlich zum rechnen
brauche, interpretiere ich das so, dass dein Vorschlag nicht
funktionieren wird.

Grüße Daniel
Claus Reibenstein
2009-08-09 15:38:15 UTC
Permalink
Post by Daniel Schmidt
Post by Claus Reibenstein
Sag mal, bist Du so blöd oder tust Du nur so? Ich habe Dir doch schon
den Link genannt, wo Du Deine Lösung findest! Wie wäre es denn, wenn Du
dies zur Abwechslung auch mal LESEN würdest?
ich *habe* deinen Link gelesen und die Manual so gedeutet, dass INT
nicht von CAST unterstützt wird. Da ich INT offensichtlich zum rechnen
brauche, interpretiere ich das so, dass dein Vorschlag nicht
funktionieren wird.
Du brauchst nicht INT zum Rechnen, sondern ganze Zahlen, auch INTEGER
genannt - und die findest Du auch in meinem Link.

Mit Verlaub: Dir fehlen elementare Grundlagen. Eigne sie Dir an.

Gruß. Claus
Christian Kirsch
2009-08-07 09:59:36 UTC
Permalink
Post by Daniel Schmidt
Hallo,
ich möchte nur gerade Ergebnisse mit MySQL abfragen. Also z.B. 2, 4, 6,
8, 10 Rows. Bei ungeraden Ergebnissen sollen dann nur die Geraden, also
eins weniger angezeigt werden. Ist soetwas mit MySQL möglich?
SELECT bla DIV 2 * 2 FROM foo

aber was hat Ganzahlarithmetik mit MySQL zu tun?
Daniel Schmidt
2009-08-10 20:44:56 UTC
Permalink
Post by Christian Kirsch
SELECT bla DIV 2 * 2 FROM foo
aber was hat Ganzahlarithmetik mit MySQL zu tun?
Ich glaube meine Fragestellung war nicht korrekt. Ich habe nicht vor
MySQL als Taschenrechner zu mißbrauchen.

Also, vorhanden ist eine Datenbank mit 1000 Datensätzen. Aus diesen
möchte ich immer nur gerade Ergebnisse abfragen. Wenn ich also nach
"Fußball" suche und 27 Ergebnisse in der Datenbank enthalten sind,
sollen nur 26 ausgegeben werden. Bei 101 Ergebnissen sollen nur 100
ausgegeben werden, usw.

Grüße Daniel
Christian Kirsch
2009-08-11 06:51:08 UTC
Permalink
Post by Daniel Schmidt
Post by Christian Kirsch
SELECT bla DIV 2 * 2 FROM foo
aber was hat Ganzahlarithmetik mit MySQL zu tun?
Ich glaube meine Fragestellung war nicht korrekt. Ich habe nicht vor
MySQL als Taschenrechner zu mißbrauchen.
Also, vorhanden ist eine Datenbank mit 1000 Datensätzen. Aus diesen
möchte ich immer nur gerade Ergebnisse abfragen.
Die Kardinalität der Ergebnis*menge* soll geradzahlig sein.
Post by Daniel Schmidt
Wenn ich also nach
"Fußball" suche und 27 Ergebnisse in der Datenbank enthalten sind,
sollen nur 26 ausgegeben werden. Bei 101 Ergebnissen sollen nur 100
ausgegeben werden, usw.
Ich kann mir schwer vorstellen, dass das mit einem SQL-Befehl geht. Und
Du sagst nicht, *welche* 26 der 27 Du gerne hättest. Soll das die DB
irgendwie zufällig machen? Willst Du die Daten sortieren und dann nur
die letzten 26 ausgeben? Oder ...?

*Wie* Du die größte geradzahlige Zahl < number_of_rows ausrechnest,
steht da ja schon.
Daniel Schmidt
2009-08-12 11:06:36 UTC
Permalink
Post by Christian Kirsch
*Wie* Du die größte geradzahlige Zahl < number_of_rows ausrechnest,
steht da ja schon.
Kannst Du mir ein Beispiel liefern, ich blicke jetzt nicht mehr durch.
Ich kann doch ein Ergebnisnit in das WHERE Statement übernehmen!?

Grüße Daniel
Dominik Echterbruch
2009-08-12 11:14:18 UTC
Permalink
Post by Daniel Schmidt
Post by Christian Kirsch
*Wie* Du die größte geradzahlige Zahl < number_of_rows ausrechnest,
steht da ja schon.
Kannst Du mir ein Beispiel liefern, ich blicke jetzt nicht mehr durch.
Ich kann doch ein Ergebnisnit in das WHERE Statement übernehmen!?
Wenn ich den Thread richtig interpretiere, willst du die Daten ja nicht
im Rohformat auf der MySQL-Konsole anzeigen, sondern in irgendeine
Anwendung einbetten. Warum ermittelst du nicht dort die Ergebnismenge
und zeigst einfach bei ungerader Anzahl den letzten Datensatz nicht mit
an? Das ist doch viel einfacher, als eine solche Aufgabe einem
mengenorientierten System aufzudrücken.

Aus reiner Neugierde: Warum willst du eigentlich immer nur gerade
Anzahlen von Datensätzen? Mir ist eine solche Problemstellung bisher
noch nicht untergekommen.

Grüße,
Dominik
--
Wo kämen wir hin, wenn alle sagten, wo kämen wir hin, und niemand
ginge, um einmal zu schauen, wohin man käme, wenn man ginge.
Autor: Kurt Marti (http://de.wikiquote.org/wiki/Kurt_Marti)
Axel Schwenke
2009-08-12 11:51:01 UTC
Permalink
Post by Daniel Schmidt
Ich glaube meine Fragestellung war nicht korrekt. Ich habe nicht vor
MySQL als Taschenrechner zu mißbrauchen.
Also, vorhanden ist eine Datenbank mit 1000 Datensätzen. Aus diesen
möchte ich immer nur gerade Ergebnisse abfragen. Wenn ich also nach
"Fußball" suche und 27 Ergebnisse in der Datenbank enthalten sind,
sollen nur 26 ausgegeben werden. Bei 101 Ergebnissen sollen nur 100
ausgegeben werden, usw.
Das würde man wohl besser außerhalb der Datenbank machen. Z.B. in PHP

1 $con= mysql_connect(...);
2 $res= mysql_query("SELECT foo FROM bar", $con);
3 $num= mysql_num_rows($res);
4 if ($num & 1) { --$num }
5 for ($i= 0; $i<$num; ++$i) {
6 $row= mysql_fetch_assoc($res);
7 printf("foo ist '%s'\n", $row["foo"]);
8 }
9 mysql_free_result($res);

In Zeile 3 wird die Anzahl der Ergebniszeilen geholt. In Zeile 4 wird
geschaut, ob das ungerade ist und wenn ja, um eins verringert.
Zeilen 5-8 holen die gerade Anzahl von Zeilen ab. Zeile 9 verwirft den
Rest des Ergebnisses (falls da einer ist).

Fehlerbehandlung ist zu ergänzen.


PS: irgendwie zickt der Newsserver von 1&1, deswegen resend


XL

Harald Stowasser
2009-08-07 13:35:29 UTC
Permalink
Post by Daniel Schmidt
Hallo,
ich möchte nur gerade Ergebnisse mit MySQL abfragen. Also z.B. 2, 4, 6,
8, 10 Rows. Bei ungeraden Ergebnissen sollen dann nur die Geraden, also
eins weniger angezeigt werden. Ist soetwas mit MySQL möglich?
Interesante Aufabe:

BEGIN;
DROP TABLE IF EXISTS pool;
CREATE TEMPORARY TABLE pool (id int)
SELECT SQL_CALC_FOUND_ROWS id FROM networks;
SELECT @unevenid:=(MAX(id) + (FOUND_ROWS()+1) % 2) FROM pool;
DELETE FROM pool WHERE id=@unevenid;
SELECT * FROM networks m,pool p WHERE p.id=n.id;
END;

So das sollte funktionieren. Vielleicht hat jemand ne bessere Idee?



Viel Spaß am Gerät

Harald.
Loading...