[MySQL] Komplexer Select

Goltergaul

Well-known member
ID: 17553
L
26 April 2006
480
7
Hallo ich habe folgende Tabelle:
id|attempt|question|answer|timestamp
12|26|1|1,2,3:1|978303600
14|26|1|1,2,3:|978300600
17|26|2|3,4,5,6:|978303400
und er soll mir folgendes auslesen:
1. attempt muss 26 sein
2. es darf nur ein datensatz pro question sein. (also nur eine Zeile von den Zwei, und zwar die, mit dem neueren Timestamp...

Wie kann ich das machen? Habs mit MAX() und Group BY probiert aber es haut nicht so hin, wie ich es gerne hätte :/

Danke :)
 
Ich habs jetzt so verstanden:

SELECT spaltennamen FROM table
WHERE attempt= 26 AND question = 1
ORDER BY timestamp DESC
LIMIT 0,1

Ich würde mir auch nochmal Gedanken über die Strukur der Tabelle machen, denn in der Spalte answer trägt man nicht 1,2,3 ein... is kein gutes DB-Design.
 
nein das ist es nicht was ich meine. Das Design ist so vorgegeben, es handelt sich um ein Plugin, dass ich schreibe...

Also deine Abfrage gibt mir alle zeilen mikt attempt=26 und question=1 zurück.
Ich will aber alle Zeilen mit Attempt und (unique)question (gemeint: pro question id nur eine Zeile). Und da wo es in der DB mehrere Zeilen mit der selben Questionid (question = question ID) und dem selben attempt gibt, soll er mir nur diejenige Zeile mit dem neueren Timestamp ausgeben.
 
Hier noch das gewollte Ergebnis aus obiger Tabelle.
id|attempt|question|answer|timestamp
12|26|1|1,2,3:1|978303600
17|26|2|3,4,5,6:|978303400
 
Meine abfrage dürfte dir nur eine Zeile zurückgeben... LIMIT 0,1 ... aber hab vorhin nicht zuende gedacht.

probier mal:

SELECT MAX(timestamp),question
FROM tabelle
WHERE attempt=26
GROUP BY attempt, question
 
SELECT MAX(timestamp),question
FROM tabelle
WHERE attempt=26
GROUP BY attempt, question

GROUP By attempt ist quatsch, weil er dann nur einen Datensatz (alle haben ja 26) ausgibt. Und dein Group by question sagt noch nicht aus, welche der beiden Einträge mit question 1 er nehmen soll.

Was ginge wäre ein Subselect, allerdings glaube ich, es gibt noch eine performantere Lösung, auf die ich aber gerade nicht komme. Der Subselect wäre so:

SELECT t1.*
FROM tabelle t1
WHERE attempt=26 AND timestamp=
(SELECT MAX(timestamp)
FROM tabelle t2
WHERE t2.question=t1.question);

Grüße,
Sebastian
 
GROUP By attempt ist quatsch, weil er dann nur einen Datensatz (alle haben ja 26) ausgibt. Und dein Group by question sagt noch nicht aus, welche der beiden Einträge mit question 1 er nehmen soll.

Was ginge wäre ein Subselect, allerdings glaube ich, es gibt noch eine performantere Lösung, auf die ich aber gerade nicht komme. Der Subselect wäre so:

SELECT t1.*
FROM tabelle t1
WHERE attempt=26 AND timestamp=
(SELECT MAX(timestamp)
FROM tabelle t2
WHERE t2.question=t1.question);

Grüße,
Sebastian

Ich würde sagen erstmal überlegen und dann schreiben... was vielleicht quatsch ist, ist dein SQL-Statement. Was meinst du wozu ich GROUP BY und MAX() eingesetzt habe? Nur aus lieber langer weile bestimmt nicht. Dann schau dir mal weiter oben das erwartete Ergebnis an, und genau das erreiche ich mit meiner Abfrage.

Nur zu Info...es soll nur ein Datensatz zu jeder Frage angezeigt werden und dazu noch der mit dem neueren Datum. Was willst du da mit mit deiner aussage man weiss nicht welche enträge genommen werden sollen? is doch logisch, die mit dem neuesten timestamp...
 
Nur zu Info...es soll nur ein Datensatz zu jeder Frage angezeigt werden und dazu noch der mit dem neueren Datum. Was willst du da mit mit deiner aussage man weiss nicht welche enträge genommen werden sollen? is doch logisch, die mit dem neuesten timestamp...
Naja, Dein GROUP BY wird nicht zwingend die zum Timestamp passende Id liefern. Es ist nicht vorherzusagen, dass der zum MAX(timestamp) passende Datensatz zurückgeliefert wird...
 
ja habe ich ausprobiert, und stellt exakt das ergebnis dar, was weiter oen gewünscht ist.

ich meinte eigentlich auch den Threadersteller, denn ich bin auch der Meinung, dass deine Lösung die einfachste ist und auch genau das Ergebnis bringt, das im ersten Thread gefordert ist.
 
unter den obigen 3 datensätzen vielleicht. aber er ist für mich nicht geeignet, weil er nicht alle bedingungen berücksichtigt ;) trotzdem danke für die Mühe :)
 
ja aber dann solltest du auch alle Bedingungen nennen, die berücksichtigt werden müssen.
So ist das genau das Ergebnis, nach dem du im ersten Post gesucht hast.
 
ja aber dann solltest du auch alle Bedingungen nennen, die berücksichtigt werden müssen.
So ist das genau das Ergebnis, nach dem du im ersten Post gesucht hast.

sehe ich genauso... die zu berücksichtigenden bedingungen hatte ich ja eigentlich aus dem ersten posting übernommen.
 
ja aber dann solltest du auch alle Bedingungen nennen, die berücksichtigt werden müssen.
So ist das genau das Ergebnis, nach dem du im ersten Post gesucht hast.

Hat er doch: Ein Datensatz pro question. Deine Abfrage liefert einen Datensatz züruck, nicht wie zu erwarten 2 (schließlich muss einer mit question=1 und einer mit question=2 zurückgegeben werden).

Grüße,
Sebastian
 
Meine Abfrage hat ja auch 2 datensätze zurück gegeben, nur habe ich die Antworten nicht mit berücksichtigt, da das ja nicht im Posting stand und ich auch nicht wusste was er für Daten braucht... aber ist ja nun auch nicht weiter schlimm, du hast ja die korrekte Lösung gebracht, auch wenns nen schrottiges DB-Design ist :)

PS: Die Abfrage kannte ich so noch gar nicht, also noch was gelernt :). Im Subselect noch die erste Tabelle verknüpft :)