Ich schreibe gerade eine Webapp, die Benutzer basierend auf der beantworteten Frage entspricht. Ich habe meinen Matching-Algorithmus in nur einer Abfrage realisiert und so weit eingestellt, dass es 8,2 ms dauert, um den Übereinstimmungs-Prozentsatz zwischen 2 Benutzern zu berechnen. Aber meine Webanwendung muss eine Liste von Benutzern erstellen und die Liste durchlaufen, in der diese Abfrage ausgeführt wird. Für 5000 Benutzer dauerte es 50 Sekunden auf meinem lokalen Rechner. Ist es möglich, alles in eine Abfrage zu setzen, die eine Spalte mit der Benutzer-ID und eine Spalte mit der berechneten Übereinstimmung zurückgibt? Oder ist eine gespeicherte Prozedur eine Option?SQL: Benutzer-Tabelle mit berechneter Spalte für Übereinstimmungs-Prozentsatz zurückgeben?
Ich arbeite derzeit mit MySQL aber bereit Datenbanken zu wechseln, wenn nötig.
Für alle Interessierten in das Schema und die Daten, ich habe eine SQLFiddle erstellt: http://sqlfiddle.com/#!2/84233/1
und meine passende Abfrage:
SELECT COALESCE(SQRT((100.0*as1.actual_score/ps1.possible_score) * (100.0*as2.actual_score/ps2.possible_score)) - (100/ps1.commonquestions), 0) AS perc
FROM (SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 101
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 1) AS as1,
(SELECT SUM(value) AS possible_score, COUNT(*) AS commonquestions
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 101
WHERE uq1.user_id = 1) AS ps1,
(SELECT SUM(imp.value) AS actual_score
FROM user_questions AS uq1
INNER JOIN importances imp ON imp.id = uq1.importance
INNER JOIN user_questions uq2 ON uq2.question_id = uq1.question_id AND uq2.user_id = 1
AND (uq1.accans1 = uq2.answer_id
OR uq1.accans2 = uq2.answer_id
OR uq1.accans3 = uq2.answer_id
OR uq1.accans4 = uq2.answer_id)
WHERE uq1.user_id = 101) AS as2,
(SELECT SUM(value) AS possible_score
FROM user_questions AS uq1
INNER JOIN importances ON importances.id = uq1.importance
INNER JOIN user_questions uq2 ON uq1.question_id = uq2.question_id AND uq2.user_id = 1
WHERE uq1.user_id = 101) AS ps2
Sie können die „häufig gestellte Fragen“ subexpression der beiden „Beine“ der Abfrage kombinieren. Sie könnten verallgemeinern auch die Unterabfragen für Benutzer = 1 und user = 101 in eine generali CTE-Abfrage (wenn Ihr DBMS suppoert sie aber zuerst:. Bitte zeigen Sie uns die Tabellendefinitionen und vielleicht einige Daten. – wildplasser
Ja, Daten mit der jeweiligen gewünschten Ausgabe –
Ich habe eine SQLFiddle zum Spielen erstellt :) Wenn ich Benutzer 1 und 5 übereinstimmte, sollte das Ergebnis '43 .678 'sein http://sqlfiddle.com/#!2/84233/1 – Mexxer