juper: MySQL

Hi there
Ich habe folgendes Problem, und zwar habe ich eine Tabelle, mit angenommen 3 spalten
ID   WERT1    WERT2
1     1         2
2      0        1

Nun möchte ich, falls der wert höher als 0 ist, für jeden wert die zeile einzeln selektieren, sprich das ergebnis sollte folgendermassen ausschauen
ID   WERT1
1      1
ID   WERT2
1      2
2      1

Ich habe zwar im MySQL manual die IF Bedingung gefunden, kann allerdings nicht wirklich etwas damit anfangen

vielen dank für die hilfe

  1. Hallo

    ID   WERT1    WERT2
    1     1         2
    2      0        1

    Nun möchte ich, falls der wert höher als 0 ist, für jeden wert die zeile einzeln selektieren, sprich das ergebnis sollte folgendermassen ausschauen

    Ich habe leider nicht ganz verstanden, was Du willst. Du zeigst uns hier zwei Ergebnismengen:

    ID   WERT1
    1      1

    Dieses Ergebnis erhältst Du mit

    SELECT  
      ID,  
      WERT1  
    FROM tabellenname  
    WHERE WERT1 > 0
    

    Die zweite Ergebnismenge analog mit

    ID   WERT2
    1      2
    2      1

    SELECT  
      ID,  
      WERT2  
    FROM tabellenname  
    WHERE WERT2 > 0
    

    Wenn Du etwas anderes suchst, müsstest Du dies genauer erklären.

    Freundliche Grüße

    Vinzenz

    1. Hallo

      ID   WERT1    WERT2
      1     1         2
      2      0        1

      Nun möchte ich, falls der wert höher als 0 ist, für jeden wert die zeile einzeln selektieren, sprich das ergebnis sollte folgendermassen ausschauen

      Ich habe leider nicht ganz verstanden, was Du willst. Du zeigst uns hier zwei Ergebnismengen:

      ID   WERT1
      1      1

      Dieses Ergebnis erhältst Du mit

      SELECT

      ID,
        WERT1
      FROM tabellenname
      WHERE WERT1 > 0

      
      >   
      > Die zweite Ergebnismenge analog mit  
      >   
      > > ID   WERT2  
      > > 1      2  
      > > 2      1  
      >   
      > ~~~sql
      
      SELECT  
      
      >   ID,  
      >   WERT2  
      > FROM tabellenname  
      > WHERE WERT2 > 0
      
      

      Wenn Du etwas anderes suchst, müsstest Du dies genauer erklären.

      Freundliche Grüße

      Vinzenz

      Hi Vinzenz, die Ergebnisse sind Richtig, allerdings möchte ich alle in einem SELECT erhalten. Sprich das ich mit evtll mit einer IF oder CASE Bedingung zuerst alle Wert1 abfrage und sie ausgebe, und in einem 2ten schritt alle Wert2.
      Ich frage mich allerdings gerade, ob das überhaupt möglich ist

      1. Hallo

        sei doch bitte so nett und unterlasse in Zukunft "Fullquotes". Die meisten Mitleser (und das Archiv) werden es Dir danken.

        ID   WERT1
        1      1
        ID   WERT2
        1      2
        2      1

        Hi Vinzenz, die Ergebnisse sind Richtig, allerdings möchte ich alle in einem SELECT erhalten.

        Wie stellst Du Dir dies vor. Deine zwei Ergebnismengen haben unterschiedliche Spaltenüberschriften. Einmal heißt die zweite Spalte WERT1, einmal WERT2. Eine Spalte kann aber nur eine Überschrift haben.

        Spielt die Überschrift jedoch keine Rolle, d.h. wenn Dein Ergebnis

        ID   WERT
         1      1
         1      2
         1      1

        lauten darf, dann kannst Du dies mit einem Statement erreichen. Falls Deine MySQL-Version >= 4.0.0 ist, wäre UNION eine Möglichkeit.

        Freundliche Grüße

        Vinzenz

        1. sei doch bitte so nett und unterlasse in Zukunft "Fullquotes". Die meisten Mitleser (und das Archiv) werden es Dir danken.

          ai
          sorry, macht der gewohnheit *rot werd*

          Wie stellst Du Dir dies vor. Deine zwei Ergebnismengen haben unterschiedliche Spaltenüberschriften. Einmal heißt die zweite Spalte WERT1, einmal WERT2. Eine Spalte kann aber nur eine Überschrift haben.

          Jep ist mir eben auch in den Sinn gekommen, geht nicht :-/
          Leider spielt der Spaltennname eine rolle

          Ich hätte noch eine weitere frage, und zwar habe ich zwei tabellen

          user
          -------------
          ID
          1

          sowie

          Freund
          ------------
          ID    User_ID
          1       1
          2       1
          3       1

          angenommen ein user hat unendlich viele freunde, ich muss allerdings einen select machen, welcher folgendes ergebnis zurückgibt

          user.ID    Freund1.ID     freund2.ID

          Wie muss ich das selektieren, dass einfach die ID's der jeweils ersten beiden Freunde der Tabelle ins select-Resultset genommen werden (Falls keiner oder nur ein Freund vorhanen, einfach nichts reinschreiben, also 0 oder null)

          1. Hi,

            Wie stellst Du Dir dies vor. Deine zwei Ergebnismengen haben unterschiedliche Spaltenüberschriften. Einmal heißt die zweite Spalte WERT1, einmal WERT2. Eine Spalte kann aber nur eine Überschrift haben.
            Jep ist mir eben auch in den Sinn gekommen, geht nicht :-/
            Leider spielt der Spaltennname eine rolle

            Das ist nicht der Untergang...
            Du könntest in deinem UNION+SELECT eine blinde Spalte verwenden:
            SELECT
              ID,
              WERT1 AS WERT1,
              null AS WERT2
            FROM tabellenname
            WHERE WERT1 > 0
            UNION
            SELECT
              ID,
              null AS WERT1,
              WERT2 AS WERT2
            FROM tabellenname
            WHERE WERT2 > 0

            Wie muss ich das selektieren, dass einfach die ID's der jeweils ersten beiden Freunde der Tabelle ins select-Resultset genommen werden (Falls keiner oder nur ein Freund vorhanen, einfach nichts reinschreiben, also 0 oder null)

            Also als erstes die Anmerkung: Das geht NICHT dynamisch, du musst im Voraus wissen wie viele Freunde du suchst. Und dann direkt die Gegenfrage: Was sind die ersten beiden Freunde, die ersten beiden gefundenen, irgendwelche beiden, oder woran kann man die identifizieren?

            MfG
            Rouven

            --
            -------------------
            ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
            1. Du könntest in deinem UNION+SELECT eine blinde Spalte verwenden:
              SELECT
                ID,
                WERT1 AS WERT1,
                null AS WERT2
              FROM tabellenname
              WHERE WERT1 > 0
              UNION
              SELECT
                ID,
                null AS WERT1,
                WERT2 AS WERT2
              FROM tabellenname
              WHERE WERT2 > 0

              Was passiert da genau? Wie Sieht da der Spaltenname aus? Sind das nicht 2 Recordsets?

              Also als erstes die Anmerkung: Das geht NICHT dynamisch, du musst im Voraus wissen wie viele Freunde du suchst. Und dann direkt die Gegenfrage: Was sind die ersten beiden Freunde, die ersten beiden gefundenen, irgendwelche beiden, oder woran kann man die identifizieren?

              Also ich weiss ja nicht, wie viele Freunde der jeweilige user hat. Im select sollen einfach Maximal 2 selektiert werden können. Die beiden ersten kann man einfach anhand der position in der datenbank identifizieren - einfach gesagt, wer zuerst kommt, mahlt zuerst
              die z ersten gefundenen werden ausgelesen

              Könnte man das nicht irgendwie mit Variablen(zbsp einem Array) lösen?
              Sprich dass ich während dem select ein select mache und das Array fülle, und dann die werde aus dem array ins recordset tue?

              1. Hi,

                Was passiert da genau? Wie Sieht da der Spaltenname aus? Sind das nicht 2 Recordsets?

                Nene, da kommt ein Recordset raus mit einer beliebigen Anzahl von Ergebnissen. Für die Spaltennamen ist das "AS" zuständig, das benötige ich auch um die Pseudo-Spalte in den beiden Abfragen überhaupt mit einem Namen zu versehen. Eine Hälfte der Datensätze hat in der einen Spalte nichts stehen, die andere in der anderen.

                Könnte man das nicht irgendwie mit Variablen(zbsp einem Array) lösen?
                Sprich dass ich während dem select ein select mache und das Array fülle, und dann die werde aus dem array ins recordset tue?

                Die Frage ist: Brauchst du _wirklich_ alles in einer Abfrage als Spalten? Mit Zeilen oder verschiedenen Abfragen ist das wirklich einfacher...
                Ansonsten wäre mein spontaner Gedanke ein zweifacher Self-JOIN (also eigentlich ein "Anzahl auszugebender Freunde"-Selfjoin.
                SELECT ursprung.user_id,
                       ursprung.id AS Freund_1
                       fuer_freund_2.id AS Freund_2
                FROM Freund AS ursprung LEFT JOIN Freund AS fuer_freund_2
                ON fuer_freund_2.userid = ursprung.userid

                Falls dir das ganze JOIN-Thema nichts sagt, hab ich hier zwei Artikel für dich:
                Einführung
                Mehrfachjoin

                MfG
                Rouven

                --
                -------------------
                ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
                1. Hallo,

                  SELECT ursprung.user_id,
                         ursprung.id AS Freund_1
                         fuer_freund_2.id AS Freund_2
                  FROM Freund AS ursprung LEFT JOIN Freund AS fuer_freund_2
                  ON fuer_freund_2.userid = ursprung.userid

                  Wobei man dann aber sicherstellen sollte, dass nicht zweimal der gleiche Freund abgefragt wird, da ich vermute, dass die Datenbank für beide Joins die gleiche Sortierung verwendet (egal ob man sie angegeben hat oder nicht).

                  Grüße
                    Klaus

                  1. Hi,

                    damn, als ich das Statement geschrieben hatte wusste ich, da fehlt noch was...
                    ...
                    WHERE fuer_freund_2.id <> ursprung.id
                       OR fuer_freund_2.id IS NULL

                    Warum zwei Bedingungen? Wenn es nur einen Freund gibt, dann dürfte
                    "NULL <> 123" zu NULL und damit nicht für das Ergebnis relevant sein...

                    MfG
                    Rouven

                    --
                    -------------------
                    ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(
                  2. SELECT ursprung.user_id,
                           ursprung.id AS Freund_1
                           fuer_freund_2.id AS Freund_2
                    FROM Freund AS ursprung LEFT JOIN Freund AS fuer_freund_2
                    ON fuer_freund_2.userid = ursprung.userid

                    Könntet ihr das mal mit den Tabellennamen USer und Freund machen?
                    was ist ursprung? Ich seh die Usertabelle nirgends...

                    1. Hi,

                      ähm, also ich erklär's dir gerne, aber vielleicht solltest du dich noch etwas mehr mit den Grundstrukturen von SQL vertraut machen.
                      MySQL+SELECT
                      Man kann sowohl Spalten als auch Tabellen mit einem Alias versehen. In der Regel macht man das um (1) lange Namen, die man mehrfach schreiben muss, durch kurze zu ersetzen oder (2) um bei mehrfacher Verwendung ein und der selben Tabelle (siehe Self-JOIN) anzugeben _welche_ der beiden man meint.
                      Einen solchen ALIAS vergibt man in der langversion mittels Schlüsselwort  AS
                      z.B. SELECT spalte1 AS anderer_name_fuer_spalte_1
                      oder SELECT spalte1 FROM tabelle1 AS anderer_name_fuer_tabelle_1

                      Da den Standardisierern aufgegangen ist, dass diese Schreibweise eigentlich zu umständlich ist, kann man das AS auch einfach weglassen.
                      Genau sowas habe ich in deiner Abfrage gemacht: Ich habe also einmal auf die Tabelle Freunde zugegriffen und sie mit "ursprung" benannt und ein weiteres Mal, wo ich sie "fuer_freund_2" genannt habe. In dem Fall ist die Umbenennung nötig gewesen, denn wenn ich Freund.ID schreib, welche der beiden meine ich dann?

                      MfG
                      Rouven

                      --
                      -------------------
                      ss:) zu:) ls:& fo:) de:< va:{ ch:? sh:) n4:( rl:? br:$ js:| ie:) fl:(