ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
479
479
EMPFEHLEN
-
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?
-
09.09.10 10:53 #2
- 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"
-
Danke erstmal für die Antwort.
Denke für die Erklärung, genau so war es ja von mir beabsichtigt
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
-
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
-
Danke nochmal für die Antworten.
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
-
Beziehung mysql 1:n
Von Fruitgum im Forum Relationale DatenbanksystemeAntworten: 10Letzter Beitrag: 04.11.09, 11:14 -
MySQL m-c Beziehung / Kategorien
Von Nob im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 27.05.09, 19:17 -
[MySQL] n-zu-n Beziehung
Von RedWraith im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 19.04.08, 01:54 -
mySQL - n:m Beziehung
Von mschneider im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 16.07.04, 12:57 -
n zu m Beziehung in MySQL
Von mC pAiN im Forum Relationale DatenbanksystemeAntworten: 6Letzter Beitrag: 28.01.04, 09:10






Zitieren


Login




