• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

[MySQL] Suche in einer m:n relation

zsoerenm

New member
Hallo,

Ich habe eine user Datenbank erstellt, die Steckbriefe enthält.

Nun möchte ich eine Suche einbauen. Ich hab jedoch ein kleines Problem mit der Relation. Ich hoffe ihr könnt mir da weiterhelfen.

Hier ist die Tabelle die beide anderen Tabelle verbindet:

id | user_id | steckbrief_eigenschaft | eintrag

"user_id" und "steckbrief_eigenschaft" sind beide vom Typ Integer und verweisen auf andere Tabellen. Die Spalte "eintrag" ist vom Typ text. Dort kommt der Usereintrag rein.

Nun möchte ich User heraussuchen die auf die Suche passen. Also User, die Einträge in verschiedenen Steckbriefeigenschaften gemacht haben.

Danke schon mal
Gruß Sören
 
dir fehlt noch ein primary-key für deine "verbindungstabelle"

ansonsten sollte das ungefähr so funktionieren:

Code:
SELECT u.user FROM verbindungstabelle AS v, usertabelle as u 
WHERE v.eintrag LIKE (gesuchter text) 
         AND v.id = u.id;
 
Vielen Dank!

der primary_key in der verbindungstabelle ist natürlich die spalte "id"

Ich hab nun noch eine Frage.

Wie kann ich diese Abfrage nun ordnen?

Zur verständlichkeit hier nochmal die Verbindungstabelle mit ein paar einträgen:
Code:
id | user_id | steckbrief_eigenschaft | eintrag
1  | 10      | id_für_nachname        | 'Müller'
2  | 15      | id_für_nachname        | 'Schmidt'
3  | 17      | id_für_nachname        | 'Meier'
4  | 15      | id_für_vorname         | 'Jessica'
5  | 17      | id_für_vorname         | 'Tom'

Also ich geb die steckbrief_eigenschaft_id(s) an und nach dieser/diesen soll dann geordnet werden (z.b. nach Nachnamen und Vorname).

ORDER BY ist mir klar aber ich wüsste nicht wie ich mit hilfe der steckbrief-eigenschaft-id nach den einträgen sortieren kann.

Wie stell ich sowas an?
Ist es überhaupt möglich sowas in eine Anweisung zu packen?

Danke
 
Zuletzt bearbeitet:
es mal ausprobiert?
Willst du nach den Werten in den Einträgen sortieren oder nach der Eigenschaft?

SELECT *
FROM rel_user_eigenschaft JOIN user USING(user_id)
JOIN eigenschaft USING(steckbrief_eigenschaft)
ORDER BY eigenschaft_name
 
Willst du nach den Werten in den Einträgen sortieren oder nach der Eigenschaft?
Nach den Werten in den Einträgen.

Code:
SELECT user.id FROM rel_user_eigenschaft 
   JOIN user USING(user_id)
   JOIN eigenschaft USING(steckbrief_eigenschaft)
   WHERE eigenschaft.steckbrief_eigenschaft = '.$suchkriterium.'
      AND rel_user_eigenschaft.eintrag = '.$suche.'

Das funktioniert schon ganz gut... aber wenn ich nun ein 2. Suchkriterium hinzufügen möchte, klappt das nicht mehr.

Code:
SELECT user.id FROM rel_user_eigenschaft 
   JOIN user USING(user_id)
   JOIN eigenschaft USING(steckbrief_eigenschaft)
   WHERE eigenschaft.steckbrief_eigenschaft = '.$suchkriterium1.'
      AND rel_user_eigenschaft.eintrag = '.$suche1.'
   AND eigenschaft.steckbrief_eigenschaft = '.$suchkriterium2.'
      AND rel_user_eigenschaft.eintrag = '.$suche2.'

Mit dem ORDER BY ist das leider auch nicht so ganz einfach...
Ich möchte die Benutzer z.b. nach dem Nachname sortieren.
Also geb ich die Steckbrief-eigenschafts-id für den Nachnamen an und nach den Einträgen, die die Benutzer für diesen Steckbrief-Eigenschaft gemacht haben, sollen diese dann sortiert werden.

Ich hoffe ich hab mich verständlich ausgedrückt ;)

Danke schon mal
 
Du müßtest dann für jedes weitere Suchkriterium rel_user_eigenschaft und eigenschaft ein weiteres mal dran joinen. Order By muss dann über jeweils 2 Spalten gehen.

Code:
SELECT user.id FROM user

   JOIN rel_user_eigenschaft rel1 USING(user_id)
   JOIN eigenschaft e1 USING(steckbrief_eigenschaft)

   JOIN rel_user_eigenschaft rel2 USING(user_id)
   JOIN eigenschaft e2 USING(steckbrief_eigenschaft)

   WHERE e1.steckbrief_eigenschaft = '.$suchkriterium1.'
      AND rel1.eintrag = '.$suche1.'
      AND e2.steckbrief_eigenschaft = '.$suchkriterium2.'
      AND rel2.eintrag = '.$suche2.'
   ORDER BY e1.steckbrief_eigenschaft, rel1.eintrag
 
Zurück
Oben