Ankündigung

Einklappen
Keine Ankündigung bisher.

alle objekte mit bestimmten werten in einer tabelle

Einklappen

Neue Werbung 2019

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

  • alle objekte mit bestimmten werten in einer tabelle

    Hallo Forum,
    ich habe eine Tabelle, die mit objekt IDs aus anderen tabellen gefüllt ist.

    Also
    Tabelle 1 = Gegenstand
    Tabelle 2 = Merkmal
    Tabelle 3 = Gegenstand_Merkmal

    Ein Gegenstand kann mehrere merkmale haben.

    In T3 steht dann:

    obj_id, Merkmal_id
    1 , 2
    1 , 3
    1 , 7
    2 , 4
    2 , 5

    Ich will jetzt alle Gegenstände haben, die die merkmal IDs 2, 3 und 7 haben.
    Das müsste dann die obj-id 1 sein.

    Wie sieht denn jetzt die MySQL abfrage aus?

    Ich bin mit meinem Latein völlig am ende.
    Nicht gedacht, dass sowas triviales so schwer zu lösen ist mit MySQL


    Danke für eure Hilfe im voraus.


  • #2
    Das ist total einfach mit JOINS zu lösen.

    Kommentar


    • #3
      Hab ich auch schon versucht.
      Irgendwie steh ich heute auf'm schlauch und find die Lösung nicht.

      Vielleicht denk ich auch wieder zu kompliziert.....

      Kommentar


      • #4
        SELECT t1.obj_id FROM t1
        LEFT JOIN t3
        ON t1.obj_id = t3.obj_id
        WHERE ausstatt_id = '2'
        AND ausstatt_id = '2'
        AND ausstatt_id = '3'

        klappt z.B. nicht.

        Kommentar


        • #5
          AND ausstatt_id = '2'
          AND ausstatt_id = '3'
          Schliesst sich auch gegenseitig aus. Der wert kann nie gleichzeitig 2 une 3 sein

          Kommentar


          • #6
            Wie funktioniert es dann?
            OR geht nicht, da zwingend alle werte vorkommen müssen....

            Kommentar


            • #7
              lerne Grundlagen.
              WHERE ausstatt_id IN(2,3,7) könnte Dir helfen, aber auch wenn Du es jetzt hinbekommst setze Dich mit der Materie mal auseinander, das ist sowas von Banal

              Kommentar


              • #8
                In der Dokumentation von MySQL wird IN als alternative zu OR beschrieben.

                Irgendwie hab ich da einen Denkfehler in der Sache.

                Bei der Abfrage werden auch Objekte ausgegeben, die zwar das Merkmal 2 aber NICHT 3 und 7 haben.
                die Objekte müssen aber ALLE Merkmale besitzen.

                Kommentar


                • #9
                  achso na das ist etwas komplizierter, wenn nicht unmöglich mit reinem sql, da die Anzahl der Merkmale variabel ist...
                  Wenns nur die drei merkmale sind musst Du eben die Tabelle T3 dreimal joinen

                  Kommentar


                  • #10
                    Ah, ok.
                    Danke!

                    Dann hab ich jetzt jedenfalls gewissheit, dass es so nicht funktioniert.
                    Da muss ich mir wohl eine andere Strategie überlegen.

                    Es können mehr als drei Merkmale sein.
                    Vielleicht währe eine Alternative die Merkmale als Spalte einer Tabelle anzulegen?
                    Ich denke mehr als zwanzig werden es nicht.

                    Kommentar


                    • #11
                      Ich würde einfach alle auslesen und das ganze dann in ein Array speichern dann kannste das einfach auswerten ohne die DB zu belasten
                      also ein array der struktur:
                      Gegenstand['merkmal'] = array(2,3,7)
                      das halt so aus der DB lesen und dann in einer schleife mit in_array abfragen

                      Kommentar


                      • #12
                        Ja, wäre auch eine Möglichkeit.

                        Vielen Dank für Deine Hilfe.

                        Gruß,
                        cyber_mc

                        Kommentar


                        • #13
                          Zitat von cyber_mc Beitrag anzeigen
                          Nicht gedacht, dass sowas triviales so schwer zu lösen ist mit MySQL
                          Ist es auch nicht.

                          Mittels WHERE-Klausel alle Datensätze selektieren, die die gewünschte Merkmal-ID haben, nach obj_id Gruppieren, mittels COUNT die Anzahl dieser Datensätze ermitteln, und mittels HAVING nur die ins Ergebnis übernehmen, bei denen diese Anzahl 3 (bzw. anderer Wert entsprechend der Anzahl der Merkmal-IDs) ist.

                          Kommentar


                          • #14
                            Wie wärs damit:

                            Code:
                            SELECT obj_id
                            FROM  `gegenstand_merkmal` 
                            WHERE merkmal_id
                            IN ( 2, 3, 7  ) 
                            GROUP  BY obj_id
                            HAVING COUNT(  DISTINCT merkmal_id )  = 3
                            Eine andere Möglichkeit fällt mir grad nicht ein.

                            Es ist defintiv performanter als einfach alles auszulesen und mit PHP zu prüfen.

                            Wenn die Tabelle einen UNIQUE-Index für (obj_id, merkmal_id) hat, dann kann man das DISTINCT im SQL-Audruck auch weglassen.

                            EDIT: Oh, da war Chris ein paar Minuten schneller als ich

                            Kommentar

                            Lädt...
                            X