El algoritmo de comparación de usuarios de Rails 3 a SQL Query (COMPLICADO)

Actualmente estoy trabajando en una aplicación que coincide con los usuarios según las preguntas respondidas. Me di cuenta de mi algoritmo en las consultas normales de RoR y ActiveRecord, pero es muy lento utilizarlo. Para hacer coincidir un usuario con otros 100 usuarios toma

Completed 200 OK in 17741ms (Views: 106.1ms | ActiveRecord: 1078.6ms)

en mi máquina local. Pero aún así ... ahora quiero darme cuenta de esto en SQL sin formato para obtener más rendimiento. Pero realmente estoy teniendo problemas para concentrarme en las consultas de SQL dentro de las consultas de SQL y cosas como esta, más cálculos, etc. Mi cabeza está a punto de explotar y ni siquiera sé por dónde empezar.

Aquí está mi algoritmo:

def match(user)
  @a_score = (self.actual_score(user).to_f / self.possible_score(user).to_f) * 100
  @b_score = (user.actual_score(self).to_f / user.possible_score(self).to_f) * 100

  if self.common_questions(user) == []
    0.to_f
  else
    match = Math.sqrt(@a_score * @b_score) - (100 / self.common_questions(user).count)
    if match <= 0
      0.to_f
    else
      match
    end
  end
end

def possible_score(user)
  i = 0
  self.user_questions.select("question_id, importance").find_each do |n|
    if user.user_questions.select(:id).find_by_question_id(n.question_id)
      i += Importance.find_by_id(n.importance).value
    end
  end
  return i
end

def actual_score(user)
  i = 0
  self.user_questions.select("question_id, importance").includes(:accepted_answers).find_each do |n|
    @user_answer = user.user_questions.select("answer_id").find_by_question_id(n.question_id)
    unless @user_answer == nil
      if n.accepted_answers.select(:answer_id).find_by_answer_id(@user_answer.answer_id)
        i += Importance.find_by_id(n.importance).value
      end
    end
  end
  return i
end

Entonces, básicamente, un usuario responde una pregunta, elige qué respuestas acepta y qué tan importante es esa pregunta para él. Luego, el algoritmo verifica qué preguntas tienen en común 2 usuarios, si el usuario 1 dio una respuesta que el usuario 2 acepta, si la respuesta es sí, entonces se agrega la importancia que el usuario2 asignó a cada pregunta, que conforma el puntaje que obtuvo el usuario1. También al revés para user2. Dividido por la posible puntuación, se obtiene el porcentaje y ambos porcentajes aplicados a la media geométrica me dan un porcentaje de coincidencia total para ambos usuarios. Bastante complicado lo sé. Dime si no te lo expliqué lo suficientemente bien. Solo espero poder expresar esto en SQL crudo. El rendimiento es todo en esto.

Aquí están mis tablas de base de datos:

CREATE TABLE "users" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "username" varchar(255) DEFAULT '' NOT NULL); (left some unimportant stuff out, it's all there in the databse dump i uploaded)

CREATE TABLE "user_questions" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_id" integer, "question_id" integer, "answer_id" integer(255), "importance" integer, "explanation" text, "private" boolean DEFAULT 'f', "created_at" datetime);

CREATE TABLE "accepted_answers" ("id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, "user_question_id" integer, "answer_id" integer);

Supongo que la parte superior de la consulta SQL tiene que verse algo como esto?

SELECT u1.id AS user1, u2.id AS user2, COALESCE(SQRT( (100.0*actual_score/possible_score) * (100.0*actual_score/possible_score) ), 0) AS match
FROM 

Pero como no soy un maestro de SQL y solo puedo hacer las cosas habituales, mi cabeza está a punto de explotar. Espero que alguien pueda ayudarme a resolver esto. O al menos mejorar mi rendimiento de alguna manera! ¡Muchas gracias!

EDITAR:

Entonces, en base a la respuesta del asistente, logré obtener una buena declaración SQL para "possible_score"

SELECT SUM(value) AS sum_id 
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

He intentado obtener el "actual_score" con esto pero no funcionó. Mi administrador de base de datos se bloqueó cuando ejecuté esto.

SELECT SUM(imp.value) AS sum_id 
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
INNER JOIN accepted_answers as ON as.user_question_id =  uq1.id AND as.answer_id = uq2.answer_id
WHERE uq1.user_id = 1
EDIT2

Está bien, soy un idiota! No puedo usar "como" como un alias, por supuesto. Lo cambié a aa y funcionó! W00T!

Respuestas a la pregunta(2)

Su respuesta a la pregunta