MySQL Query: MySQL Query

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

  1. 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

    1. 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.

      • 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)

      => 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

      1. 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

        1. 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

          1. 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...

            1. 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

              1. 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

            2. 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

            3. 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

              1. 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

  2. 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

  3. yo,

    welche version, angeben der spalten der betroffenen tabellen, beispieldaten mit gewünschter ergebnismenge angeben, dann werden sie geholfen.

    Ilja

  4. 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

    1. 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

  5. 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.

    --
    Javascript ist toll (Perl auch!)
    1. 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

      1. 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.

        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.

        --
        Javascript ist toll (Perl auch!)