[SQL allgemein] hilfe bei sql statement

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

  • [SQL allgemein] hilfe bei sql statement

    hallo zusammen

    habe ein Problem mit meiner SQL Abfrage:

    Ich habe folgende Tabelle:

    artikelnummer Gruppe Eigenschaft
    ===========================
    1000 1 Küche
    1000 1 Badezimmer
    1000 2 direkt
    1000 2 indirekt
    2000 1 Wohnzimmer
    2000 1 Badezimmer
    2000 2 indirekt
    usw

    Die Eigenschaften sind Gruppen zuegordnet. Dies, weil ich von einer Gruppe mehrere mit oder verknüpfen möchte: Küche oder Badezimmer. Weiter möchte ich die verschiedenen Gruppen mit and verknüpfen.

    Ich möchte nun eine Abfrage machen in dieser Art:

    Gib mir alle Artikelnummer die die Eigenschaft Küche oder Badezimmer haben und direktstrahelnd sind.

    Ich schaffe es einfach nicht, dieses SQL statement ohne left joins zu erstellen. Gibt es irgendwie eine schnelle Abfrage, da ich bis zu 3 Mio Einträge habe.

    Danke

    Peter

  • #2
    Code:
    SELECT DISTINCT artikelnummer
    FROM tabelle
    WHERE 
      eigenschaft = 'Küche'
      OR eigenschaft = 'Badezimmer'
    Da ich nicht weiß, wo das direktstrahlend herkommt, hab eich es weggelassen
    Ich denke, also bin ich. - Einige sind trotzdem...

    Kommentar


    • #3
      danke für die antwort, aber leider ist das direktstrahlend wichtig:

      es ist in der gruppe 2.

      es sollte in dieser Art sein:

      (Badezimmer or Küche) and (direktstrahlend)

      und da alle eigenschaften in unterschiedliche tupels vorhanden ist, kann ich leider diese Abfrage nicht verwenden.

      Kommentar


      • #4
        Code:
        SELECT DISTINCT artikelnummer
        FROM tabelle
        WHERE 
          (
            eigenschaft = 'Küche'
            OR eigenschaft = 'Badezimmer'
          )
          AND gruppe = 2
        Ich denke, also bin ich. - Einige sind trotzdem...

        Kommentar


        • #5
          nee ;-)

          in gruppe1 sind: Küche und Badezimmer
          in Gruppe2 sind: direkt und indirekt


          meine Abfrage soll nun (küche or Badezimmer) and (direkt or indirekt) zbsp retour geben.

          Kommentar


          • #6
            OK, und wie sah/sieht dein Join aus und warum meinst du, kannst du ihn nicht nutzen?
            Ich denke, also bin ich. - Einige sind trotzdem...

            Kommentar


            • #7
              Weiter möchte ich die verschiedenen Gruppen mit and verknüpfen.
              Das was Du willst wird mit einer einfachen Abfrage nicht gehen, weil die
              benötigten Daten NIE in einer Zeile liegen.
              und da alle eigenschaften in unterschiedliche tupels vorhanden ist, kann ich leider diese Abfrage nicht verwenden
              richtig erkannt und das wird immer so sein ohne JOIN!

              Entweder musst Du Deine Datenbankstruktur nochmal ändern und die Eigenschaften der Gruppe 2 in ein zusätzliches Feld eintragen.
              Oder Du musst einen JOIN verwenden auf die gleiche Tabelle mit anderem alias.
              Code:
              SELECT DISTINCT t1.artikelnummer
              FROM tabelle AS t1
              LEFT JOIN tabelle AS t2
              ON (t1.artikelnummer = t2.artikelnummer AND t2.gruppe =2 AND 
              t2.eigenschaft = 'direkt')
              WHERE 
                t1.eigenschaft IN ('Küche','Badezimmer')
              Verknüpfungen mit OR macht man besser mit IN (). ist wesentlich schneller, weil dann ein Index benutzt wird.
              Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

              Kommentar


              • #8
                Ich habe mal diesen test früher mal mit den left joins gemacht (zwar mit or , nicht mit IN) und bei 300'000 Artikel mit je 20 Eigenschaften (total 6.mio tupels) mit mehreren left joins auf sich selbst kann die Abfrage gegen das unendliche laufen.

                Wie könnte ich denn meine Datenstruktur verbessern? Mir kam nur diese Lösung in den Sinn, da sie total flexibel ist.

                Ich habe ja nicht nur 2 Gruppen sonden n-Gruppen mit je m Eigenschaften.

                Kommentar


                • #9
                  Du hast Gruppen => 1 Tabelle
                  Du hast Eigenschaften => 1 Tabelle
                  Du hast Objekte einer Gruppe mit bestimmten Eigenschaften => 1 Tabelle
                  Ich denke, also bin ich. - Einige sind trotzdem...

                  Kommentar


                  • #10
                    Original geschrieben von Pflugi

                    Wie könnte ich denn meine Datenstruktur verbessern? Mir kam nur diese Lösung in den Sinn, da sie total flexibel ist.
                    Ich habe ja nicht nur 2 Gruppen sonden n-Gruppen mit je m Eigenschaften.
                    flexibel ja, brauchbar nein.
                    Dir wird wohl nichts übrig bleiben als entweder für jede Gruppe ein extra Feld in der gleichen Tabelle oder eine extra Tabelle zu machen, wenn Du gleichzeitig mehrere Gruppen abfragen willst.

                    Wenn Du eine Adressdatenbank machst machst Du ja auch nicht nur drei Felder nach dem Prinzip
                    Code:
                    User  Adresseigenschaft Wert
                    1000 Name                     Müller
                    1000 Vorname                Hans
                    1000 strasse                  Feldweg 13
                    1000 Ort                         München
                    ....
                    Wie willst Du da die Daten von einem User zusammenkriegen?
                    Genauso ist das mit Deinen Artikeln.
                    Um alle Eigenschaften eines Artikels zu ermitteln, sollten sie schon in einer Zeile/Tupel liegen bzw mit einem JOIN über die Artikelnummer einfach zu ermitteln sein
                    Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

                    Kommentar


                    • #11
                      kannst du das genauer beschreiben mit der extra Tabelle? Verstehe nicht genau was du meinst.

                      Kommentar


                      • #12
                        Jeder Artikel hat ca. 20 Gruppen. D.h. Du machst entweder für jede Gruppe ein Feld mit einem Namen, der was über die Gruppe aussagt, z.B
                        Ort, Strhlung, etc und trägst da die Werte aus dem Feld Eigenschaft ein.

                        Oder Du machst jeweils eine Tabelle für jede Gruppe in der jeder Artikel nur einmal vorkommt (Primarschlüssel)

                        z.B.
                        Tabelle Orte
                        Artikelnummer Ort
                        1000 Küche
                        1001 Bad
                        1002 Wohnzimmer
                        ...

                        Tabelle Strahlung
                        Artikelnummer Strahlung
                        1000 direkt
                        1001 indirekt
                        1002 direkt
                        ..

                        usw für jede Gruppe
                        Die zehn Gebote sind deswegen so kurz und logisch, weil sie ohne Mitwirkung von Juristen zustande gekommen sind. (Charles de Gaulle)

                        Kommentar


                        • #13
                          hmm.... also ein Artkel kann mehrere Eigenschaften von einer gruppe haben.

                          bsp: Artikel ist ein Küchen und ein Badezimmerartikel. Gleichzeitig kann er noch Eigenschaften aus anderen Gruppen haben.

                          dann funzt das schon wieder nicht mehr:-(

                          ich habe mal meinen alten ansatz weiter verfolgt:

                          select * from tabelle where eigenschaft IN (Badezimmer, Küche, direkt) group by Gruppe having count(*) = 2

                          mit having cont(*) = 2 wollte ich die zwei Gruppen, die ich habe abfangen....

                          aber geht auch nicht :-(

                          Kommentar

                          Lädt...
                          X