Häufigste Werte für eine Gruppe, die von einer Select-Abfrage abhängig ist

7

Ich bringe mir den Kopf darüber, wie man das in SQL macht. Ich habe einen Tisch:

%Vor%

Es enthält Benutzerantworten auf eine bestimmte Frage. Eine Frage könnte mehrere Antworten haben. Ein Benutzer kann dieselbe Frage nicht zweimal beantworten. (Daher gibt es nur eine Antwort_ID pro {User_id, Question_ID})

Ich versuche, eine Antwort auf diese Frage zu finden: Für eine bestimmte Frage und Antwort-ID (im Zusammenhang mit der gleichen Frage), möchte ich die häufigste Antwort auf die Frage von Benutzern mit der angegebenen Antwort gefunden / p>

Zum Beispiel für die obige Tabelle:

%Vor%

Ist es möglich, in einer Abfrage zu tun? Sollte es in einer Abfrage durchgeführt werden? Soll ich nur gespeicherte Prozedur oder Java für diese verwenden?

    
StationaryTraveller 03.07.2017, 17:24
quelle

3 Antworten

4

Obwohl @ rick-james recht hat, bin ich nicht sicher, ob es einfach ist, zu starten, wenn Sie nicht wissen, wie solche Abfragen normalerweise für MySQL geschrieben sind.

  1. Sie benötigen eine Abfrage, um die häufigsten Antworten auf Fragen zu finden:

    %Vor%

    Dies würde eine Tabelle zurückgeben, in der wir für jede question_id Zahlen in absteigender Reihenfolge ausgeben.

    %Vor%
  2. Und jetzt sollten wir eine so genannte Größte-N-pro-Gruppe lösen Aufgabe. Das Problem ist, dass in MySQL aus Gründen der Leistung die Aufgaben in der Regel nicht in reinem SQL gelöst werden, sondern mit Hacks, die auf dem Wissen beruhen, wie die Abfragen intern verarbeitet werden.

    In diesem Fall wissen wir, dass wir eine Variable definieren und dann über die ready-Tabelle iterieren können, Kenntnisse über die vorherige Zeile haben, die es uns erlaubt, zwischen der ersten Zeile in einer Gruppe und den anderen zu unterscheiden.

    %Vor%

    Stellen Sie sicher, dass Sie die Variable initialisiert haben (und ihren Datentyp bei der Initialisierung beachten, andernfalls wird sie möglicherweise später unerwartet erfasst). Hier ist das Ergebnis:

    %Vor%
  3. Jetzt müssen wir nur Zeilen mit NULL in der letzten Spalte ausfiltern. Da die Spalte nicht benötigt wird, können wir den gleichen Ausdruck in die WHERE-Klausel verschieben. Die cnt-Spalte wird auch nicht benötigt, also können wir sie auch überspringen:

    %Vor%
  4. Das letzte, was zu erwähnen ist, um die Abfrage effizient zu machen, sollten Sie korrekte Indizes haben. Diese Abfrage erfordert einen Index, der mit (question_id, answer_id) Spalten beginnt. Da Sie sowieso einen UNIQUE-Index benötigen, ist es sinnvoll, ihn in dieser Reihenfolge zu definieren: (question_id, answer_id, user_id).

    %Vor%

Hier ist ein Puzzle, mit dem Sie spielen können: Ссылка .

    
newtover 13.07.2017, 11:49
quelle
4

Willst du einen Fisch? Oder möchtest du lernen, wie man fischt?

Ihre Frage scheint mehrere Schritte zu haben.

  1. Informationen über "Fragen von Benutzern mit der gegebenen Antwort" abrufen. Entwerfen Sie dieses SELECT und stellen Sie sich vor, dass die Ergebnisse eine neue Tabelle bilden.

  2. Übernehmen Sie die Einschränkung "ANDERE". Dies ist wahrscheinlich ein kleiner AND ... != ... , der zu SELECT #1 hinzugefügt wurde.

  3. Finden Sie nun die "häufigste Antwort". Dies beinhaltet wahrscheinlich ORDER BY COUNT(*) DESC LIMIT 1 . Es ist wahrscheinlich

verwenden Sie eine abgeleitete Tabelle:

%Vor%     
Rick James 08.07.2017 17:47
quelle
1

Ihre Frage ist mehrfach konditional, Sie müssen die ersten Fragen mit ihrem fragenden Benutzer aus Question table:

bekommen %Vor%

Fügen Sie dann die Antwort auf die gestellte Frage ein und führen Sie einige Überprüfungen in Ihrem Java-Code durch (ist der Benutzer auf dieselbe Frage wie der Benutzer geantwortet, der diese Frage stellt, wird der Benutzer diese Frage mehrmals beantwortet).

%Vor%     
AsifAli72090 14.07.2017 19:45
quelle

Tags und Links