Microhome
Erfahrenes Mitglied
Hallo zusammen,
ich möchte gern einen Vergleich via MySQL Abfrage anstellen und die Anzahl der Häufigkeiten von Übereinstimmungen, der Reihenfolge nach sortiert, zurückbekommen.
Hierzu ein kleines Beispiel:
Tabelle 1: id | hobby
Tabelle 2: id | name | hobby
Die Tabellen haben folgende Inhalte:
Tabelle 1:
1 | Schwimmen
2 | Tennnis
3 | Klavier
4 | Handball
Tabelle 2:
1 | Robin | 1,3
2 | Lars | 1,2,3
3 | Laura | 2
4 | Marc | 3,4
Nehmen wir an, ich sei Robin, dann möchte ich folgende Reihenfolge durch möglichst eine Abfrage zurückbekommen: 2,4,3
Nun meine Fragen:
a) Wie würdet ihr die Hobbys in Tabelle 2 speichern? Also String, also Zahlen mit Komma getrennt, oder aber bspw. als serialisiertes Array? Oder bietet es sich sogar an eine dritte Tabelle zu erstellen (userid | hobbyid), in welcher jede Zuordnung einen eigenen Eintrag bekommt?
b) Wie müsste die oben gewünschte Abfrage in MySQL möglichst ressourceschonend aussehen? Gehen wir davon aus, dass es 10.000 verschiedene Hobbys gibt und 10 Mio Namen.
c) Gibt es hierfür womöglich eine eigene MySQL Funktion?
Um die Übereinstimmungen zu suchen, würde ich bspw. folgende Abfrage verwenden. Allerdings ist hier das Problem, dass eben Zeile für Zeile durchgegangen werden muss, was bei einer Vielzahl an Einträgen wahrscheinlich jedes Mal viel zu lang dauert. Schön wäre es, wenn MySQL eine Funktion zur Verfügung stellt (Frage c), die direkt nach der Häufigkeit sucht und so z.b. nach den 10 häufigsten Treffern aufhört weiterzusuchen.
Vielen Dank für die Hilfe und ich bin sehr auf eure Vorschläge und Meinungen gespannt!
ich möchte gern einen Vergleich via MySQL Abfrage anstellen und die Anzahl der Häufigkeiten von Übereinstimmungen, der Reihenfolge nach sortiert, zurückbekommen.
Hierzu ein kleines Beispiel:
Tabelle 1: id | hobby
Tabelle 2: id | name | hobby
Die Tabellen haben folgende Inhalte:
Tabelle 1:
1 | Schwimmen
2 | Tennnis
3 | Klavier
4 | Handball
Tabelle 2:
1 | Robin | 1,3
2 | Lars | 1,2,3
3 | Laura | 2
4 | Marc | 3,4
Nehmen wir an, ich sei Robin, dann möchte ich folgende Reihenfolge durch möglichst eine Abfrage zurückbekommen: 2,4,3
Nun meine Fragen:
a) Wie würdet ihr die Hobbys in Tabelle 2 speichern? Also String, also Zahlen mit Komma getrennt, oder aber bspw. als serialisiertes Array? Oder bietet es sich sogar an eine dritte Tabelle zu erstellen (userid | hobbyid), in welcher jede Zuordnung einen eigenen Eintrag bekommt?
b) Wie müsste die oben gewünschte Abfrage in MySQL möglichst ressourceschonend aussehen? Gehen wir davon aus, dass es 10.000 verschiedene Hobbys gibt und 10 Mio Namen.
c) Gibt es hierfür womöglich eine eigene MySQL Funktion?
Um die Übereinstimmungen zu suchen, würde ich bspw. folgende Abfrage verwenden. Allerdings ist hier das Problem, dass eben Zeile für Zeile durchgegangen werden muss, was bei einer Vielzahl an Einträgen wahrscheinlich jedes Mal viel zu lang dauert. Schön wäre es, wenn MySQL eine Funktion zur Verfügung stellt (Frage c), die direkt nach der Häufigkeit sucht und so z.b. nach den 10 häufigsten Treffern aufhört weiterzusuchen.
Code:
$pattern = implode('|', $hobbies);
$sql = "
SELECT *
FROM tabelle2
WHERE hobbies REGEXP '{$pattern}";
Vielen Dank für die Hilfe und ich bin sehr auf eure Vorschläge und Meinungen gespannt!