Zu den Aufzeichnungen der tutorials.de-Live-Workshops
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
479
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.251
    Hi,

    Angenommen ich habe folgende drei Tabellen, mit welchen ich jeder Person beliebige Eigenschaften zuordnen kann:
    -personen,
    -eigenschaften,
    -zuordnung

    Jetzt möchte ich alle Personen, die die Eigenschaften 1,2 und 3 haben. Meine Abfrage sieht im Moment folgendermaßen aus.

    Code sql:
    1
    2
    3
    4
    
    SELECT personen_id FROM zuordnung
    WHERE eigenschaften_id IN (1,2,3)
    GROUP BY personen_id
    HAVING COUNT(*)=3

    Das kann aber doch nicht die Lösung sein. Oder geht man bei einer so normalisierten Struktur wirklich so vor? Ich störe mich besonders an der letzte Zeile.
    Also wie muss die Abfrage "richtig" aussehen?
     

  2. #2
    Avatar von Bratkartoffel
    Bratkartoffel Bratkartoffel ist offline gebratene Kartoffel
    tutorials.de Premium-User
    Registriert seit
    Jun 2007
    Ort
    Passau (Niederbayern)
    Beiträge
    1.294
    Hallo,

    bei der Abfrage rufst du alle Personen ab, die eine der 3 Eigenschaften haben -> "WHERE eigenschaften_id IN (1,2,3)"
    Nur wenn alle 3 Eigenschaften vorhanden sind -> "HAVING COUNT(*)=3", wird die personen_id ausgegeben. Die personen_id wird nur einmal ausgegeben, obwohl diese 3x vorhanden ist -> "GROUP BY personen_id".
    Das mal kleine Erklärung zu der Abfrage.

    Mir fällt jetz auch nicht ein, wie man das anders machen könnte / warum man das nicht so machen sollte. Also ich denke, dass deine Lösung richtig ist.

    Gruß
    BK
     
    Über eine gute Bewertung freut sich jeder ;)
    Bitte erledigte Threads als "Erledigt" markieren.

    "Though a program be but three lines long, someday it will have to be maintained.''
    -- Geoffrey James, "The Tao of Programming"

  3. #3
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.251
    Danke erstmal für die Antwort.

    Zitat Zitat von Bratkartoffel Beitrag anzeigen
    bei der Abfrage rufst du alle Personen ab, die eine der 3 Eigenschaften haben -> "WHERE eigenschaften_id IN (1,2,3)"
    Nur wenn alle 3 Eigenschaften vorhanden sind -> "HAVING COUNT(*)=3", wird die personen_id ausgegeben. Die personen_id wird nur einmal ausgegeben, obwohl diese 3x vorhanden ist -> "GROUP BY personen_id".
    Denke für die Erklärung, genau so war es ja von mir beabsichtigt

    Zitat Zitat von Bratkartoffel Beitrag anzeigen
    Mir fällt jetz auch nicht ein, wie man das anders machen könnte / warum man das nicht so machen sollte. Also ich denke, dass deine Lösung richtig ist.
    Ich dachte nur, dass sowas bei normalisierten Tabellen doch ständig vorkommt und es da vielleicht irgendwas gibt, wovon ich noch nichts weiß . Und "liefert das richtige Ergebnis" ist nicht das gleiche wie "richtig".
    Ohne Normalisierung würde es ja ganz einfach funktionieren:
    Code sql:
    1
    
    SELECT id FROM personen WHERE eigenschaft_a=1 AND eigenschaft_b=2 AND eigenschaft_c=3;

    Aber da will ich natülich nicht hin, zumal es keine Beschränkung gibt, wie viele Eigenschaften eine Person haben kann und nach welchen ich Suche.

    Grüße
     

  4. #4
    Avatar von Yaslaw
    Yaslaw Yaslaw ist gerade online n/a
    tutorials.de Moderator
    Registriert seit
    Dec 2007
    Ort
    Winterthur(CH)
    Beiträge
    4.641
    Wenn du sicher sein willst, dass jede Eigenschaft dabei nur einmal pro Benutzer vorkommt und es genau diese Eigenschaften sind, kannst du auch so etwas machen
    Code sql:
    1
    2
    3
    4
    
    SELECT personen_id
    FROM zuordnung
    GROUP BY personen_id
    HAVING GROUP_CONCAT(eigenschaften_id ORDER BY eigenschaften_id SEPARATOR ",") = "1,2,3"
     
    ---------------------------------------------------------------------------------------------------
    item: Tutorial: [PHP][MySQL] Debug Queries
    item: Schreibt mir keine PN mit Fragen die im Forum beantwortet werden können - ich mache kein persönliches coaching
    item: Ich habe es mir aus gesundheitlichen Gründen abgewöhnt unformatierten Code zu lesen (Auch SQL-Statements kann man formatieren!)
    item: Bitte zur besseren Lesbarkeit PHP-Code in [PHP]...[/PHP], SQL in [SQL]...[/SQL], Visual Basic in [VB]...[/VB] etc. schreiben

  5. #5
    CPoly CPoly ist gerade online Mitglied Weizenbier
    tutorials.de Premium-User
    Registriert seit
    Sep 2009
    Beiträge
    2.251
    Danke nochmal für die Antworten.

    Zitat Zitat von yaslaw Beitrag anzeigen
    Wenn du sicher sein willst, dass jede Eigenschaft dabei nur einmal pro Benutzer vorkommt
    Die beiden Spalten in der Tabelle "zuordnung" haben einen UNIQUE-Index.

    Ich weiß nicht, ob die Konkatenation über mehrere hunderttausend Spalten so performant ist. Und es müssen nicht genau die drei sein, sondern die drei sollen bei der Person vorkommen, unabhängig davon, ob die Person noch weitere Eigenschaften hat.
    Meine Eingangs vorgestellte Abfrage liefert genau das, was ich will, nur wollte ich sicher gehen, dass es auch auch der beste Weg ist.

    Grüße.
     

Ähnliche Themen

  1. Beziehung mysql 1:n
    Von Fruitgum im Forum Relationale Datenbanksysteme
    Antworten: 10
    Letzter Beitrag: 04.11.09, 11:14
  2. MySQL m-c Beziehung / Kategorien
    Von Nob im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 27.05.09, 19:17
  3. [MySQL] n-zu-n Beziehung
    Von RedWraith im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 19.04.08, 01:54
  4. mySQL - n:m Beziehung
    Von mschneider im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 16.07.04, 12:57
  5. n zu m Beziehung in MySQL
    Von mC pAiN im Forum Relationale Datenbanksysteme
    Antworten: 6
    Letzter Beitrag: 28.01.04, 09:10