Verwenden von Schienen. Ich habe den folgenden Code:
%Vor%Mit diesen Tabellensätzen:
%Vor%Ich möchte die Anzahl der eindeutigen Patienten zählen, hängt vom Typ der Blockkombination ab, hier ist das erwartete Ergebnis:
%Vor%Ich habe versucht, an den Tabellen wie folgt teilzunehmen:
%Vor% Aber es gibt einfach zu viel Komplexität und die Anzahl ist falsch. Ich wollte Raw-SQL ausprobieren, aber Rails 4 hat es nicht weiter unterstützt und verlangt von mir, dass ich ModelClass.find_by_sql
mache.
Wie kann ich die oben erwarteten Ergebnisse generieren?
Die einzige Lösung, die mir in den Sinn kommt, ist die Verwendung von Raw SQL und die Nutzung der group_concat
function , wie hier hier .
Das benötigte SQL ist das:
%Vor%Die innere Auswahl von Gruppen durch die Patienten und wählt die Kombinationen von Blocktypen, die jeder des Patienten hat. Die äußere Auswahl zählt dann einfach die Patienten in jeder Kombination.
Die Abfrage gibt Folgendes zurück (siehe die SQL-Geige ):
%Vor%Wie Sie sehen, gibt die Abfrage keine Nullzahl zurück. Dies muss in Ruby-Code gelöst werden (vielleicht wird ein Hash mit allen Kombinationen mit Nullen initialisiert und dann mit den Abfragezählungen zusammengeführt).
Um diese Abfrage in Ruby zu integrieren, verwenden Sie einfach die Methode find_by_sql
für jedes Modell (und konvertieren Sie zum Beispiel die Ergebnisse in einen Hash):
Die Antwort von BoraMa ist korrekt. Ich möchte nur ansprechen:
Wie Sie sehen können, gibt die Abfrage keine Nullzählung zurück, muss dies sein im Ruby-Code gelöst (vielleicht einen Hash mit allen Kombinationen initialisieren) mit Nullen und fusionieren dann mit der Abfrage zählt).
Es könnte durch Verwendung von reinem MySQL erreicht werden:
%Vor% SQLFiddleDemo
< p>
Ausgabe:
%Vor%Wie es funktioniert:
Um besser zu verstehen, wie es funktioniert Postgresql
version des Generierens aller Kombinationen:
SqlFiddleDemo2
< p>
Tags und Links sql mysql ruby-on-rails