PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Wie ist es möglich, dass die SQL-Abfrage und ActiveRecord.find_by_sql unterschiedliche Ergebnisse zurückgeben?

Sie haben in beiden Beispielen das richtige Ergebnis.

Wenn Sie nur count verwenden Bei der Auswahl erhalten Sie immer eine Zahl als Ergebnis der Abfrage. Ihr Ergebnis aus der Datenbank ist also zu erwarten.

Im Fall von Rails versuchen Sie, eine Reihe von Datensätzen nach scope zu erhalten mit count in Select-Anweisung. Es ist zu erwarten, dass ein leerer Satz erhalten wird, wenn Sie count haben in Ihrer Abfrage.

Probieren Sie count_by_sql aus Methode http://apidock.com/rails/ActiveRecord/Base/count_by_sql/class um die Anzahl der Datensätze anstelle einer leeren Menge zu erhalten.

Und verwenden Sie es ohne Geltungsbereich, aber mit Klassenmethode:

def self.unverified_with_no_associations()
  self.count_by_sql("SELECT COUNT(DISTINCT(accounts.id, accounts.email)) FROM accounts WHERE level = 0 AND id NOT IN
            (SELECT DISTINCT(account_id) FROM verifications) AND id NOT IN 
            (SELECT DISTINCT(account_id) FROM positions) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM edits) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM posts) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM reviews) AND id NOT IN
            (SELECT DISTINCT(sender_id) FROM kudos) AND id NOT IN
            (SELECT DISTINCT(account_id) FROM stacks WHERE account_id IS NOT NULL)")
end