Ankündigung

Einklappen
Keine Ankündigung bisher.

SELECT-Problem

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • SELECT-Problem

    Hallo,

    ich habe ein für viele von Euch sicherlich recht einfach zu lösendes Problem:
    Ich habe z.B. folgend Tabelle:
    Code:
    Spalte 1|Spalte 2|Spalte 3
    --------------------------
    0       |ABC     |12.22
    1       |ABD     |5.42
    0       |DDD     |0
    0       |ABC     |0
    1       |ABD     |4.88
    1       |ABC     |2.21
    ...
    Nun möchte ich die Zeilen daraus filtern, deren Wert in Spalte 2 mindestens zwei Mal vorkommt. Dies sind hier ABC (kommt 3 Mal vor) und ABD (kommt 2 Mal vor). DDD sollte folglich nicht Teil der Ergebnismenge sein. Ergebnis des SELECT:
    Code:
    Spalte 1|Spalte 2|Spalte 3
    --------------------------
    0       |ABC     |12.22
    1       |ABD     |5.42
    0       |ABC     |0
    1       |ABD     |4.88
    1       |ABC     |2.21
    ...
    Wie kann ich so etwas hinbekommen?

    Viele Grüße,
    erdnah

  • #2
    Code:
    SELECT
    	spalte1
    	spalte2
    	spalte3 
    FROM
    	tabelle
    GROUP BY
    	spalte2
    HAVING
    	COUNT(spalte2) > 1;
    Gruss
    L

    Kommentar


    • #3
      Naja fast, vermutlich eher mit einem Subselect:

      Code:
      SELECT
        spalte1, spalte2, spalte3
      FROM
        (
        SELECT spalte1
        FROM tabelle
        GROUP BY spalte2
        HAVING COUNT(spalte2) >= 2
        )

      Kommentar


      • #4
        lazydog, vielen Dank für die rasche Antwort!

        Leider bekomme ich dann folgendes Ergebnis:
        Code:
        Spalte 1|Spalte 2|Spalte 3
        --------------------------
        0       |ABC     |12.22
        1       |ABD     |5.42
        Ich verliere also drei Zeilen, die ich ganz gerne noch in der Ergebnismenge hätte

        Kommentar


        • #5
          Sorry mein Query stimmt hinten und vorne nicht. Nimm doch lazydog's Query als Sub-SELECT:
          Code:
          SELECT * FROM tabelle WHERE spalte2 IN
            (
            -- lazydogs sub-select
            )
          PS: Willkommen hier in unserem Forum

          Kommentar


          • #6
            Zitat von erdnah
            Ich verliere also drei Zeilen, die ich ganz gerne noch in der Ergebnismenge hätte
            Da hast du natürlich recht, ich habe deine Frage zu wenig genau gelesen. Da brauchst du tatsächlich einen Subselect
            Code:
            SELECT
               spalte1,
               spalte2,
               spalte3
            FROM
               tabelle
            WHERE
               spalte 2 IN(
                  SELECT 
                     spalte2 
                  FROM
                     tabelle
                  GROUP BY
                     spalte2
                  HAVING
                     COUNT(spalte2) > 1
               );
            Gruss
            L

            Kommentar


            • #7
              Danke für die Begrüßung

              Gut, mit
              Code:
              SELECT t2.*
              FROM
                (SELECT * FROM test GROUP BY spalte2 HAVING COUNT(spalte2) > 1) AS t1
              LEFT JOIN test AS t2
              ON t1.spalte2 = t2.spalte2
              funktioniert es sogar, nur leider sind in der "richtigen" Tabelle etwa 150.000 Zeilen, wo die Anfrage Ewigkeiten dauert und ich bisher noch nicht die Muße hatte bis zum Ende abzuwarten

              @Edit: Lazydogs Lösung bringt auch das richtige Ergebnis... wahrscheinlich muss ich mir die Daten einfach einmal ziehen und dann am Besten neu in eine Tabelle schreiben, um dann weiter damit zu arbeiten...

              Kommentar


              • #8
                Wenn du schon Probleme mit der Performance hast, solltest du niemals SELECT * FROM schreiben, sondern nur die Attribute abfragen, die du wirklich brauchst. Das ist im Subselect z.B. nur spalte2. Ausserdem wäre es gut, wenn du darauf einen Index legen würdest.
                Gruss
                L

                Kommentar


                • #9
                  Wow, das Ersetzen des * durch "spalte2" hat wahnsinnig was gebracht, das habe ich auch total übersehen... einen Index habe ich nun auch auf die Spalte gelegt. Vielen Dank!!

                  Kommentar

                  Lädt...
                  X