Schwierige SQL-Abfrage

lll192837465lll

Erfahrenes Mitglied
Hallo Zusammen

Ich habe da ein Problemchen und ich weiss echt nicht mehr weiter. Am besten beginne ich am Anfang:

Ich programmiere im Moment ein UpdateSystem für eine Flash-Seite, nun gibt es da aber eine Funktion im Flash, welche nur mit einem statischen Pfad funktioniert.
Somit ist das CMS beinträchtig, jedoch habe ich trotzdem eine Variante gefunden um es zu updaten. Es gibt 30 Flash Files, welche alle auf einen anderen Pfad zeigen.
Diese haben den Namen imgnews1 - 30. Die Pfade ebenso (Nur am Ende sind sie anders, also .../img/imgnews1.jpg, .../img/imgnews2.jpg usw.) Die Flashfiles verweisen darauf und das klappt alles super.

In der Datenbank werden die Bilder dann einfach mit dem Namen imgnews1 (..) heraufgeladen (es sind immer nur ca. 20 Aktiv oder Weniger, somit reichen 30 und die nächsten werden überschrieben, das stellt auch kein Problem dar).
Jetzt gibt es aber ein Problem, ich muss beim erstellen eines neuen Eintrages ein "imgnews" angeben, welches noch nicht "in verwendung" ist.

"in verwendung" heisst, Es ist in einem Datensatz vom Heutigen Datum, bis in den "zukünftigsten" Termin den es gibt.
Im Moment habe ich folgenden SQL Befehl um die Daten auszulesen:

PHP:
SELECT * FROM tabelle WHERE datum < CURRENT_DATE AND spalte LIKE 'imgnews%'
tabelle & spalte ersetzt.

Kann mir evtl. jemand sagen, wie ich das hinkriege mit dem Heute Bis und "zukünftigsten Datum" ausblenden UND dass ich nicht immer mehrmals das imgnews1 (etc. auslese) > Screenshot erklärt es.
imgnews.png


Da sollte ja jeweils auch nur immer 1x das Wort stehen. Im Moment liest der ja jeden Datensatz aus. Das ist auch ein bisschen Unschön.


Sorry fürs viele Erklären, aber ich kann mir einfach nichts darunter vorstellen und hoffe das mir jemand einen kleinen Gedankesblitz geben könnte.
Ich hoffe auch man versteht was ich sagen will :-)

Noch einen Schönen Abend & Vielen Dank
Gruss lll192837465lll
 
Sowas?
SQL:
SELECT * FROM tabelle WHERE datum NOT BETWEEN CURRENT_DATE AND MAX(datum) AND spalte LIKE 'imgnews%'  GROUP BY spalte

Aber wieso enthält deine Tabelle denn überhaupt mehrfach die gleichen Werte?
 
Sowas?
SQL:
SELECT * FROM tabelle WHERE datum NOT BETWEEN CURRENT_DATE AND MAX(datum) AND spalte LIKE 'imgnews%'  GROUP BY spalte

Aber wieso enthält deine Tabelle denn überhaupt mehrfach die gleichen Werte?


Leider gibt er mir den Fehler "<b>Warning</b>: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in <b></b> on line <b>127</b><br"
aus.. Sollte das nicht klappen?

Ich habe mehrmals dieselben Einträge weil das eben beim Flash eine Statische Abfrage ist...
 
Bei Problemen das SQL-Statement in eine Variable schreiben, diese ausgeben und das Resultat in phpMyAdmin testen
 
ich habe mir jetzt gerade mal diesen group sql befehl ein bisschen näher angeschaut. Soviel ich verstanden habe, kann man aber gar nicht alle selben namen in der tabelle gruppieren, sondern nur zusammenzählen oder durchschnitt, min, oder maximum berechnen / anzeigen. Was soll ich jetzt machen?
 
also wenn ich das Problem richtig verstanden habe, dann suchst du aus einer Tabelle Werte die einmalig vorkommen sollen. Wenn dein Statement also etwa so aussieht (einen * sollte man eher nicht programmieren): Select Pfadname from bilder where einstelldatum < sysdate and bildname like 'imgnews'
so sollte ein "select distinct pfadname from bilder where...." dir nur einmal vorkommende Daten liefern.(zumindest passiert dies unter SQL für Oracle so)
Für den Fall, dass das Statement "select pfadname, bild, datum, sonstiges, Anmerkung from bilder where ... " oder so ähnlich heißt, so würde ein "select max(pfadname), bild, datum, sonstiges, ... from bilder where ... group by bild, datum, sonstiges, ... " zum Ziele führen (alternativ den Bildnamen) verwenden.
 
Also am besten schildere ich mein Problem einfach in einem Beispiel :-), es ist wie gesagt halt ziemlich verwirrend wenn ich das ganze versuche nur mit Worten zu beschreiben.
Sagen wir ich habe eine Datenbank die folgendermassen aussieht:
http://img5.imagebanana.com/img/5rmhhmwf/Datenbank.png

Der rote Strich symbolisiert das heutige Datum.
Somit sind die Einträge mit der id 1 und 2 in der Vergangenheit und der Rest in der Zukunft.
Die Ausgabe die ich schlussendlich von dieser Datenbank bräuchte, wäre: "imgname2".

Warum?
Da der Eintrag imgname1 und imgname2 in der Vergangenheit liegen, sind sie sozusagen wieder "freigegeben".
Aber da der imgname1 schon wieder für ein zukünftiges Datum gebraucht wird, ist dieser wieder gestrichen.
Darum bleibt schussendlich nur der Eintrag "imgname2" übrig, von dem gebrauch gemacht werden darf. Darum darf nur dieser ausgegeben werden.

Wie?
Ich definiere die Abfrage (in meinen Worten etwa so):
"Liese die Daten aus der Spalte "imgname" aus, welche Älter sind als Heute, aber nicht in der Zukunft vorkommen."

SQL:
Ich brauche lediglich den SQL Befehl, welcher mir sagt "aber nicht in der Zukunft vorkommen."

Zusammenfassung:
Das heisst wenn jetzt mehrere Datensätze ausgelesen werden, wird es vorkommen dass in der Vergangenheit imgname1 z.B. 2mal ausgelesen wird (verschiedener Datensatz).
Darum dachte ich wär vielleicht auch noch (zur reinen Verschönerung) toll, wenn man das ganze Zusammenfassen könnte, zu "einer Gruppe"(group by, geht ja glaube ich nicht wirklich für diese Idee).
Damit am Schluss nicht so etwas herauskommt:
http://img5.imagebanana.com/img/8qzf1tr8/nicht.png

sondern so:
http://img5.imagebanana.com/img/fz3fqb61/richtig.png
halt einfach wie die Anzeige wäre (sortiert & zusammen)


Vielen Dank ich hoffe dass ich jetzt einigen das verstehen erleichtert habe :)
 
Das geht mit einem Subquery ganz gut

Das Subquery nimmt alle imgname die in der Zukunft liegen. DISTINCT unterbindet doppelte Datensätze.
Das Haubtquery nimmt all imgname die in der Vergangenheit oder jetzt sind welche nicht im Subquery vorkommen.
SQL:
SELECT DISTINCT
	imgname
FROm 
	tabelle
WHERE
	datum <= CURRENT_DATE
	AND imgname NOT IN (SELECT DISTINCT
						imgname
					FROM
						tabelle
					WHERE
						datum > CURRENT_DATE 	
					)
 
Zuletzt bearbeitet von einem Moderator:
Zurück