Select String in MySQL DB
Mark
- datenbank
0 Vinzenz Mai0 Mark0 Vinzenz Mai0 Mark1 Vinzenz Mai0 Mark
Hallo,
ich habe ein kleineres Problem mit einem Select in einer MySQL DB.
Meine Tabelle sieht ca. so aus:
id|datum|wert
1|100|lala1
2|101|lala2
3|102|lala3
4|103|lala4
5|104|lala5
6|105|lala6
Nun möchte ich von den drei neusten (datum = max) Einträgen einen per Zufall auswählen. Sprich, per Zufall id 4, 5 oder 6 auswählen.
Bisher sieht das bei mir so aus (der Teil "WHERE (bedingung LIKE 'irgendEtwas')" ist nur der Vollständigkeit halber...):
SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"
Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...
Besten Dank schon einmal!
Hallo,
ich habe ein kleineres Problem mit einem Select in einer MySQL DB.
welche Version?
Meine Tabelle sieht ca. so aus:
id|datum|wert
1|100|lala1
2|101|lala2
3|102|lala3
4|103|lala4
5|104|lala5
6|105|lala6
naja, Datumswerte sehen anders aus :-)
Nun möchte ich von den drei neusten (datum = max) Einträgen einen per Zufall auswählen. Sprich, per Zufall id 4, 5 oder 6 auswählen.
Bisher sieht das bei mir so aus (der Teil "WHERE (bedingung LIKE 'irgendEtwas')" ist nur der Vollständigkeit halber...):
SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...
Ein Subselect sollte Dir helfen, MySQL 4.1 ist die Voraussetzung.
Freundliche Grüße
Vinzenz
Hallo,
ich habe ein kleineres Problem mit einem Select in einer MySQL DB.
welche Version?
Meine Tabelle sieht ca. so aus:
id|datum|wert
1|100|lala1
2|101|lala2
3|102|lala3
4|103|lala4
5|104|lala5
6|105|lala6naja, Datumswerte sehen anders aus :-)
Nun möchte ich von den drei neusten (datum = max) Einträgen einen per Zufall auswählen. Sprich, per Zufall id 4, 5 oder 6 auswählen.
Bisher sieht das bei mir so aus (der Teil "WHERE (bedingung LIKE 'irgendEtwas')" ist nur der Vollständigkeit halber...):
SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...
Ein Subselect sollte Dir helfen, MySQL 4.1 ist die Voraussetzung.
Freundliche Grüße
Vinzenz
MySQL 5.x
Und ja, Datum sieht anders aus. Dann nennen wir es halt einfach i. Ist nur Symbolisch gemeint um mein Problem zu erklären...
Wie baue ich denn so Subselects auf?
Hallo Mark,
bitte kein TOFU und auch kein TUFO ;-)
id|datum|wert
1|100|lala1
2|101|lala2
3|102|lala3
4|103|lala4
5|104|lala5
6|105|lala6
SELECT wert FROM tabelle WHERE (bedingung LIKE 'irgendEtwas') ORDER BY rand(NOW()) LIMIT 1"
Mir fehlt also eigentlich "nur" das er nicht aus allen sondern den neusten drei Einträgen auswählt... Nur wie mach ich das? ORDER BY Datum bringt mich auch nicht weiter...
Ein Subselect sollte Dir helfen, MySQL 4.1 ist die Voraussetzung.
MySQL 5.x
Wie baue ich denn so Subselects auf?
so wie es im Handbuchkapitel Subquery-Syntax steht.
Du möchtest:
Gib mir einen
zufälligen Datensatz
aus
den drei Datensätzen,
die das neueste Datum aufweisen
Freundliche Grüße
Vinzenz
Besten Dank für den Link.
Ich habe mir eine Select-Abfrage zusammengebaut komm aber nicht weiter:
SELECT * FROM tbl1
WHERE id = ANY
(SELECT id FROM tbl1
WHERE (autor LIKE '0') ORDER BY position DESC LIMIT 0,3)
ORDER BY rand(NOW()) LIMIT 1
Ich denke das dies mein gewünschtes Ziel erreicht, doch blöderweise bekomme ich diese Meldung:
"#1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
Gibt es noch eine andere Möglichkeit das ganze mit einem Query abzufragen?
Guss
Hallo Mark,
Ich habe mir eine Select-Abfrage zusammengebaut komm aber nicht weiter:
SELECT * FROM tbl1
WHERE id = ANY
(SELECT id FROM tbl1
WHERE (autor LIKE '0') ORDER BY position DESC LIMIT 0,3)ORDER BY rand(NOW()) LIMIT 1
ergibt erwartungsgemäß die von Dir angeführte Fehlermeldung. Du kannst LIMIT nicht dazu nutzen ein IN bzw. ANY-Konstrukt mit Daten zu füllen.
Gibt es noch eine andere Möglichkeit das ganze mit einem Query abzufragen?
Dir ist ja klar, dass
SELECT
<spaltenliste>
FROM
<tabelle>
ORDER BY
position DESC
LIMIT 3
die drei Datensätze liefert, aus denen Du einen zufällig auswählen willst. Du kannst dieses ganz simpel umsetzen, indem Du Deinen Datensatz genau aus dieser Ergebnismenge wählst:
SELECT -- Gib mir
a.spalte1, -- die gewünschten
...
a.spalteN -- Spalten
FROM ( -- aus dem Abfrageergebnis von
SELECT -- Gib mir
<spaltenliste> -- die gewünschten Spalten
FROM -- aus
<tabelle> -- meiner Tabelle
ORDER BY -- nach
position DESC -- Position absteigend sortiert,
LIMIT 3 -- beschränkt auf die ersten drei Datensätze
) a -- das über den Namen a angesprochen wird
ORDER BY -- sortiert nach
RAND() -- Zufall
LIMIT 1 -- begrenzt auf einen Datensatz
Sowas nennt man übrigens auch einen temporären View.
Freundliche Grüße
Vinzenz
Besten Dank! So hat es geklappt...