MySQL Query
MySQL Query
- datenbank
0 Vinzenz Mai0 Query
0 steckl0 Ilja0 Hans0 Query
0 Struppi
Guten Morgen,
Ich habe eine Datenbank mit Tabellen die etwa so sind. A hat mehrere Status. Es soll immer der neuste Angezeigt werden. Nur DER neuste (Also einer). Wenn jetzt aber einer der Status eine Information ist, soll nicht dieser neuste, sondern der Zweitneuste (Halt einfach der, der keine Information ist) angezeigt werden.
Gibt es da irgendeine Funktion die man dazu IM QUERY verwenden könnte?
Ich wäre euch sehr dankbar!
Grüsse
Hallo
Ich habe eine Datenbank mit Tabellen die etwa so sind. A hat mehrere Status. Es soll immer der neuste Angezeigt werden. Nur DER neuste (Also einer). Wenn jetzt aber einer der Status eine Information ist, soll nicht dieser neuste, sondern der Zweitneuste (Halt einfach der, der keine Information ist) angezeigt werden.
Gibt es da irgendeine Funktion die man dazu IM QUERY verwenden könnte?
Das ist ganz einfach. Nutze die WHERE-Klausel der SELECT-Anweisung. Mehr lässt sich beim besten Willen zu Deinem Problem nicht sagen, da Du uns alle relevanten Informationen vorenthältst.
Poste doch ein paar Beispieldatensätze - und das Ergebnis, das Du gerne hättest, mit der Begründung, warum gerade dies das gewünschte Ergebnis ist.
Freundliche Grüße
Vinzenz
Hallo,
Okay ausführlicher.
Da sind einige Datensätze zB. Bücher, Videos etc.
Jedes wird angezeigt inkl. Status (über mehrere Tabellen) möchte euch damit blos nicht vollspamen ;-))
Jetzt steht in der Hauptanzeige JEDER Artikel einmal. Und dazu immer der neuste Status. (An Lager, Verkauft, In Bestellung...) Immer der neuste von denen soll angezeigt werden.
(Query steht bereits.)
Doch nun habe ich die Status erweitert, dass es noch einen 'Info' gibt. Dieser Info Status soll aber nicht angezeigt werden!
Beispiele.
=> Somit darf einfach die Information, wenn dies der letzte Status ist, nicht angezeigt werden, sondern der zweitneuste Status! (Oder 3,4,5,6 neuste, halt einfach keine Information, sonnst alles!)
Hoffe dieses Beispiel macht es deutlich und ich frage blos nach einer Möglichkeit ob es eine Funktion gibt (MySQL)?!?
Vielen Dank, Gruss
Hallo,
Jetzt steht in der Hauptanzeige JEDER Artikel einmal. Und dazu immer der neuste Status. (An Lager, Verkauft, In Bestellung...) Immer der neuste von denen soll angezeigt werden.
Deine Hauptanzeige interessiert bei dieser Frage überhaupt nicht, es interessiert Deine Tabellenstruktur, ein paar Beispieldaten und das gewünschte Resultat
(Query steht bereits.)
offensichtlich nicht.
Doch nun habe ich die Status erweitert, dass es noch einen 'Info' gibt. Dieser Info Status soll aber nicht angezeigt werden!
Beispiele.
- DVD ist vorhanden. (Status=Neu)
(Angezeigt in der Hauptseite wird: DVD, neu)- DVD wird verliehen. (Status=verliehen)
(Angezeigt wird: DVD, verliehen)- DVD bekommt Information dazu (Status=Information)
(Angezeigt wird: DVD, verliehen!!! Nicht Information, da dies irrelevant ist in der Hauptanzeige!)- DVD wird zurückgebracht (Status=Occasion)
(Angezeigt wird: DVD, Occasion)
wenn ich nach einer Tabelle frage, dann frage ich nach einer Tabelle.
Benötigt werden die relevanten Spalten und ein paar Datensätze. Was Du mit der Anzeige machst ist völlig irrelevant. Falls mehrere Tabellen beteiligt sind, bitte mehrere Tabellen. Möglicherweise benötigst Du eine Kombination der WHERE-Klausel mit einem schnuckligen Subselect. Gibt es ab MySQL 4.1.
Freundliche Grüße
Vinzenz
yo,
Deine Hauptanzeige interessiert bei dieser Frage überhaupt nicht, es interessiert Deine Tabellenstruktur, ein paar Beispieldaten und das gewünschte Resultat
ich will das gesagte von Vinz noch mal unterstreichen, dann kann dir auch wesentlich besser geholfen werden.
Ilja
Beispieldaten sind ja da...
Query möchte ich nicht hier eingeben, da es auf 5 Tabellen und rund 200 Zeilen PHP Code verstreut ist. (Da X-Filter Abfragen dazwischen sind etc. usw.)
Ich habe gefragt ob es da eine Funktion gibt, die etwas so einschränken kann...
Falls mein Query wirklich nicht exisitiert, was hier stinkefrech behauptet wird, dann würde ich wohl nicht nach so einem Detail fragen...
ich bins nochmal:
Wie waers mit nem 'group by' befehl?
In kombination mit einer passenden where-Klausel und max(...) duerfte es doch eigentlich funktionieren?
mfG,
Stefan
Hi Stefan,
Ja dacht ich mir eben auch. Jedoch krieg ich es so nicht hin, dass er den Datensatz mit einer Information dann noch nimmt.
Dann ist einfach jeder Datensatz der irgendwo dazwischen eine Information hat, nicht mehr angezeigt wird!
Danke und Gruss
yo,
schau mal, ich kann mich nicht erinnern, dass wir mal keine lösung für ein problem bezüglich datenbanken gefunden haben. hier sind einige kluge köpfe und so haben wir fast immer eine gute lösung bezüglich abfragen gefunden.
das größte problem, was wir dabei haben, dass sind nicht die abfragen, sondern die informationen zu bekommen, die wir benötigen. eine wichtige information wäre zum beispiel die version des mysql servers, weil es einen ganz erheblichen unteschied zwischen mysql 4.0 und mysql 4.1 gibt. das habe ich dir und auch vinzenz aber schon gesagt. das zweite was wir gerne wissen würde, welche spalte ist dafür verantworlich, die dafür sorgt, ob ein datensatz neuer als andere sind, können dort gleiche werte vorhanden sein, etc.
im grunde läuft es darauf hinaus, das es für am einfachsten ist, wenn wir erfahren, um welches dbms es sich mit welcher version handelt, die struktur der relevanten tabellen und spalten, beispieldaten wiederum bezüglich der relevanten daten und auch eine ergebnismenge mit begründung. das ist für uns das salz in der suppe und macht es uns um ein vielfaches einfacher, lösungen für die probleme anderer auszuarbeiten.
die lösung für dein problem könnte nämlich ganz einfach sein, indem du in der WHERE klausel alle datensätze ausschließt, die im status "Information" als inhalt haben. aber um das genau sagen zu können, bräuchten wir die oben gennanten informationen.
Ilja
Hallo Query,
Falls mein Query wirklich nicht exisitiert, was hier stinkefrech behauptet wird, dann würde ich wohl nicht nach so einem Detail fragen...
frei nach Aesop: Hic forum, hic salta!
Gruß
Vinzenz
yo Vinzenz,
Falls mein Query wirklich nicht exisitiert, was hier stinkefrech behauptet wird, dann würde ich wohl nicht nach so einem Detail fragen...
ich würde sagen, diesmal hat es dich erwischt....
Ilja
Guten Morgen,
Ich habe eine Datenbank mit Tabellen die etwa so sind. A hat mehrere Status. Es soll immer der neuste Angezeigt werden. Nur DER neuste (Also einer). Wenn jetzt aber einer der Status eine Information ist, soll nicht dieser neuste, sondern der Zweitneuste (Halt einfach der, der keine Information ist) angezeigt werden.
hallo,
gibt es auch ein feld mit der eintragereihenfolge oder datum?
dann koenntest du folgendes verwenden:
select status from A where status != 'Information' order by datum desc limit 1;
das "status != 'information'" musst du wohl so umbauen, dass es zu deiner DB passt.
Gibt es da irgendeine Funktion die man dazu IM QUERY verwenden könnte?
mit limit 1 laesst du nur den ersten eintrag in der reihenfolge ausgeben
mfG,
Steckl
yo,
welche version, angeben der spalten der betroffenen tabellen, beispieldaten mit gewünschter ergebnismenge angeben, dann werden sie geholfen.
Ilja
Hi
Gibt es da irgendeine Funktion die man dazu IM QUERY verwenden könnte?
Ich wäre euch sehr dankbar!
Natürlich. Erweitere Deine Tabelle um eine Spalte, in der Du die Nicht-Status-Information einträgst, die bisher in der Status-Spalte war. Lösche danach die Nicht-Status-Information aus der Status-Spalte. Somit bleibt nur die Status-Info in der Status-Spalte übrig. Der Rest müßte eigentlichlich ganz einfach sein. Gib mal ein Beispiel, wie die Status-Information aussieht.
Gruß
Hans
Zu dumm... Es ist definitiv noch zu früh ;-))
Hehe...
Vielen Dank, so sollte es eigendlich gehen!
Trozdem zur vervollständigung des Threads, gibt es keine solche Funktion? (Schau sonnst meinen unteren Beitrag an, da hab ich mein Problem noch etwas ausführlicher!)
Danke, Gruss
Ich habe eine Datenbank mit Tabellen die etwa so sind. A hat mehrere Status. Es soll immer der neuste Angezeigt werden. Nur DER neuste (Also einer). Wenn jetzt aber einer der Status eine Information ist, soll nicht dieser neuste, sondern der Zweitneuste (Halt einfach der, der keine Information ist) angezeigt werden.
Du meinst sowas?
SELECT * FROM A WHERE status != 'information' ORDER BY datum DESC LIMIT 1
Struppi.
Hallo Struppi,
Ich habe eine Datenbank mit Tabellen die etwa so sind. A hat mehrere Status. Es soll immer der neuste Angezeigt werden. Nur DER neuste (Also einer). Wenn jetzt aber einer der Status eine Information ist, soll nicht dieser neuste, sondern der Zweitneuste (Halt einfach der, der keine Information ist) angezeigt werden.
Du meinst sowas?
SELECT * FROM A WHERE status != 'information' ORDER BY datum DESC LIMIT 1
diese Anweisung setzt voraus, dass die Ergebnismenge aus genau einem Datensatz bestehen soll und dazu die Werte in der Spalte datum eindeutig sein müssen. Im Falle der Nichteindeutigkeit könntest Du ja zwei Datensätze mit dem gleichen Datumswert haben und somit durch Deine LIMIT-Klausel ein richtiges Ergebnis verwerfen. Darauf hat übrigens Ilja in diesem Thread bereits hingewiesen.
Das von mir kritisierte Posting läßt jedoch darauf schließen, dass die Ergebnismenge aus mehr als einem Datensatz bestehen kann, dass es verschiedene Einträge gibt, deren neuester Status, der nicht eine Information ist, zurückgeliefert werden soll.
Ob diese meine Interpretation richtig ist, das weiß ich nicht. Meine und Iljas Bemühungen, Beispieldaten zu erhalten, sind ja im Nichts verpufft. Wer weiß, vielleicht hat ja mein strenger Ton in meinem zweiten Posting dazu beigetragen. Das wäre schlecht :-(
Um jetzt fortzufahren. Stimmt meine Vermutung, so wäre dies ein klassischer Fall für eine korrelierte Unterabfrage, worauf Ilja und ich beide in diesem Thread bereits hingewiesen haben.
Ein Beispiel zur Problematik mit Erläuterungen
Beispieldaten (eine Tabelle)
id name thema zeit
-------------------------------------------------
1 Max PHP 12.06.2006 14:30
2 Moritz Datenbanken 12.06.2006 14.32
3 Max HTML 13.06.2006 08:40
4 Wilhelm HTML 14.06.2006 22:00
5 Bolte Perl 14.06.2006 22:00
6 Moritz HTML 15.06.2006 12:05
7 Moritz Datenbanken 15.06.2006 14:47
8 Max Javascript 16.06.2006 09:17
9 Wilhelm Javascript 17.06.2006 11:26
10 Max HTML 17.06.2006 11:58
Aufgabenstellung:
Benötigt wird genau ein Datensatz zu einem bestimmten Kriterium, zum Beispiel der neueste Beitrag pro Autor. Mit GROUP BY und den Aggregatsfunktionen wie min() oder max() lassen sich zwar zwei dieser Spalten bequem ermitteln, aber nicht die dazugehörenden Werte der Spalten id und thema.
Standardlösung mit korreliertem Subselect
SELECT
id,
name,
thema,
zeit
FROM nachrichten n1
WHERE zeit = (
SELECT MAX(n2.zeit)
FROM nachrichten n2
WHERE n1.name = n2.name
)
liefert das gewünschte Ergebnis
id name thema zeit
-------------------------------------------------
5 Bolte Perl 14.06.2006 22:00
7 Moritz Datenbanken 15.06.2006 14:47
9 Wilhelm Javascript 17.06.2006 11:26
10 Max HTML 17.06.2006 11:58
Möchte man jedoch keine Beiträge zum Thema HTML, so ergänzt man diese Bedingung in der WHERE-Klausel des Subselects:
SELECT
id,
name,
thema,
zeit
FROM nachrichten n1
WHERE zeit = (
SELECT MAX(n2.zeit)
FROM nachrichten n2
WHERE n1.name = n2.name
AND n2.thema != 'HTML'
)
Ergebnis (wie gefordert):
id name thema zeit
-------------------------------------------------
5 Bolte Perl 14.06.2006 22:00
7 Moritz Datenbanken 15.06.2006 14:47
8 Max Javascript 16.06.2006 09:17
9 Wilhelm Javascript 17.06.2006 11:26
Subselects unterstützt MySQL jedoch erst ab Version 4.1, wie ich in diesem Thread bereits anmerkte.
Wie der OP sein Problem angehen könnte, das hängt von seiner MySQL-Version, seinen Tabellen und deren Beziehungen untereinander ab. Deswegen haben wir hier im Thread bereits mehrfach nachgefragt.
Meine Erfahrung hier im Forum zu Mengen von PHP-Code gemischt mit einigen SQL-Statements ist übrigens die, dass mit PHP versucht wird, Funktionalität nachzubauen, die in einem Datenbankmanagementsystem bereits vorhanden ist. Allerdings muss dies, wenn man keine einzige Zeile Code gesehen hat, im konkreten Einzelfall noch lange nicht so sein. Ich gebe jedoch gerne zu, dass ich dies im Falle des OP durchaus befürchte.
Freundliche Grüße
Vinzenz
Ich habe eine Datenbank mit Tabellen die etwa so sind. A hat mehrere Status. Es soll immer der neuste Angezeigt werden. Nur DER neuste (Also einer). Wenn jetzt aber einer der Status eine Information ist, soll nicht dieser neuste, sondern der Zweitneuste (Halt einfach der, der keine Information ist) angezeigt werden.
Du meinst sowas?
SELECT * FROM A WHERE status != 'information' ORDER BY datum DESC LIMIT 1diese Anweisung setzt voraus, dass die Ergebnismenge aus genau einem Datensatz bestehen soll und dazu die Werte in der Spalte datum eindeutig sein müssen. Im Falle der Nichteindeutigkeit könntest Du ja zwei Datensätze mit dem gleichen Datumswert haben und somit durch Deine LIMIT-Klausel ein richtiges Ergebnis verwerfen. Darauf hat übrigens Ilja in diesem Thread bereits hingewiesen.
Jaja, ich wollte nur meinen Senf dazu geben, weil die Fragestellung so konfus war und der OP auch keine Anstalten gemacht, sein Problem zu konkretisieren.
Zumal die Fragestellung suggeriert, dass er offensichtlich mehrere Felder 'status' hat ("mehrere Status").
Meine Hoffnung war, dass der OP nach meinem mißglückten Beispiel evtl. mehr Informationen preisgibt.
Meine Erfahrung hier im Forum zu Mengen von PHP-Code gemischt mit einigen SQL-Statements ist übrigens die, dass mit PHP versucht wird, Funktionalität nachzubauen, die in einem Datenbankmanagementsystem bereits vorhanden ist. Allerdings muss dies, wenn man keine einzige Zeile Code gesehen hat, im konkreten Einzelfall noch lange nicht so sein. Ich gebe jedoch gerne zu, dass ich dies im Falle des OP durchaus befürchte.
nicht ausgeschlossen.
Struppi.