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

  • cyber_mc
    hat ein Thema erstellt alle objekte mit bestimmten werten in einer tabelle.

    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.

  • Griffith
    antwortet
    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

    Einen Kommentar schreiben:


  • ChrisB
    antwortet
    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.

    Einen Kommentar schreiben:


  • cyber_mc
    antwortet
    Ja, wäre auch eine Möglichkeit.

    Vielen Dank für Deine Hilfe.

    Gruß,
    cyber_mc

    Einen Kommentar schreiben:


  • HPR1974
    antwortet
    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

    Einen Kommentar schreiben:


  • cyber_mc
    antwortet
    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.

    Einen Kommentar schreiben:


  • HPR1974
    antwortet
    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

    Einen Kommentar schreiben:


  • cyber_mc
    antwortet
    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.

    Einen Kommentar schreiben:


  • HPR1974
    antwortet
    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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


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

    Einen Kommentar schreiben:


  • cyber_mc
    antwortet
    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.

    Einen Kommentar schreiben:


  • cyber_mc
    antwortet
    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.....

    Einen Kommentar schreiben:


  • HPR1974
    antwortet
    Das ist total einfach mit JOINS zu lösen.

    Einen Kommentar schreiben:

Lädt...
X