Problema: Necesito generar los Colaboradores TOP X determinados por la cantidad de mensajes publicados.

Datos: tengo una colección de los mensajes publicados. Esta no es una pregunta de Base de datos / SQL de la siguiente consulta de muestra, solo da una visión general del código.

tweetsSQL = db.GqlQuery("SELECT * FROM TweetModel ORDER BY date_created DESC")

Mi modelo:

class TweetModel(db.Model):
# Model Definition
# Tweet Message ID is the Key Name
to_user_id = db.IntegerProperty()
to_user = db.StringProperty(multiline=False)
message = db.StringProperty(multiline=False)
date_created = db.DateTimeProperty(auto_now_add=False)
user = db.ReferenceProperty(UserModel, collection_name = 'tweets')

A partir de ejemplos en SO, pude encontrar los Colaboradores TOP X haciendo esto:

    visits = defaultdict(int)
    for t in tweetsSQL:
        visits[t.user.from_user] += 1

Ahora puedo ordenarlo usando:

c = sorted(visits.iteritems(), key=operator.itemgetter(1), reverse=True)

Pero la única forma de recuperar los objetos originales ahora es recorrer el objeto c, encontrar el KeyName y luego buscar en TweetsSQL para obtener el objeto TweetModel.

¿Hay una mejor manera?

*** Lo siento, debería haber agregado que Count (*) no está disponible debido al uso del motor de aplicaciones de Google

[EDITAR 2]

En resumen, dada una lista de mensajes, ¿cómo los ordeno por recuento de mensajes del usuario?

EN SQL, sería:

SELECCIONE * DE TweetModel GROUP BY Users ORDER BY Count (*)

Pero no puedo hacerlo en SQL y necesito duplicar esta funcionalidad en el código. Mi punto de partida es "SELECCIONAR * DE TweetModel"

0
TimLeung 20 abr. 2009 a las 04:49

3 respuestas

La mejor respuesta

Use heapq.nlargest () en lugar de sorted (), por eficiencia; es para lo que sirve. No sé la respuesta sobre la parte DB de su pregunta.

1
Darius Bacon 20 abr. 2009 a las 02:35

¿Por qué no invertir el diccionario, una vez que lo ha construido, de modo que las claves son los recuentos de mensajes y los valores son los usuarios? Luego puede ordenar las claves y llegar fácilmente a los usuarios.

0
Vicki Laidler 20 abr. 2009 a las 03:16

Creo que su trabajo sería mucho más fácil si cambia la consulta SQL a algo como:

SELECT top 100 userId FROM TweetModel GROUP BY userId ORDER BY count(*)

No me molestaría con la clase TweetModel si solo necesita los datos para resolver el problema indicado.

0
RossFabricant 20 abr. 2009 a las 02:07