2012-06-20 12 views
6

Estoy haciendo una pestaña de "actividad reciente" para los perfiles en mi sitio y también voy a tener un registro para que los moderadores puedan ver todo lo que sucede en el sitio. Esto requeriría crear un registro de actividad de algún tipo.La manera más eficiente de hacer un registro de actividad

Simplemente no sé lo que sería mejor. Tengo 2 opciones:

  1. hacer una tabla llamada "actividad" y luego cada vez que alguien hace algo, añadir un registro a la misma con el tipo de acción, ID de usuario, fecha y hora, etc.
    • Problema : tabla puede ser muy larga.
  2. Une las 3 tablas (preguntas, respuestas, respuestas_comentarios) y de alguna manera muestra todo esto en la página en el orden en el que se realizó la acción.
    • Problema: esto sería extremadamente difícil porque no tengo idea de cómo podría hacerla decir "John ha comentado una respuesta en la pregunta aquí el título" con sólo 3 mesas unirse.

¿Alguien sabe de una mejor manera de hacer un registro de actividad en esta situación? Estoy usando PHP y MySQL. Si esto es demasiado ineficiente o difícil, probablemente olvide la pestaña Actividad reciente en los perfiles, pero aún necesito un registro de actividades para los moderadores.

aquí hay algo de SQL que empecé a hacer para la opción 2, pero esto no funcionaría porque no hay manera de detectar si la acción es un comentario, pregunta o respuesta cuando me hago eco de la información en un bucle while:

SELECT q.*, a.*, ac.* 
    FROM questions q JOIN answers a ON a.questionid = q.qid 
     JOIN answer_comments ac ON c.answerid = a.ans_id 
WHERE q.user = $userid 
AND a.userid = $userid 
AND ac.userid = $userid 
    ORDER BY q.created DESC, a.created DESC, ac.created DESC 

¡Gracias de antemano por cualquier ayuda!

Respuesta

1

¿Por qué usted tiene q.user y q.userid?

Para la opción 2 (la mejor opción de IMO - siempre y cuando haya indexado correctamente), creo que un UNION es más de lo que está buscando. Algo como esto:

SELECT 'question' AS action, id, created 
    FROM questions WHERE userid = {$userid} 
    UNION 
SELECT 'answer' AS action, id, created 
    FROM answers WHERE userid = {$userid} 
    UNION 
SELECT 'comment' AS action, id, created 
    FROM answer_comments WHERE userid = {$userid} 
ORDER BY created DESC LIMIT 20 

El 'question'/'answer'/'comment' le dice que se actuó. Posibles problemas que puede surgir: al ser un UNION, cada declaración SELECT debe tener el mismo número de columnas, por lo que si una es corta, simplemente puede agregar un NULL p.:

SELECT 'comment', id, created, NULL FROM ac 

Además, si uno de los created columnas tiene un nombre diferente puede simplemente alias

SELECT 'comment', id, comment_date AS created FROM ac 
+0

Lo sentimos, el segundo debería ser 'a.userid' (que era un error tipográfico). De todos modos muchas gracias! Voy a probar esto y, si funciona, aceptaré tu respuesta: D Y gracias por esa forma de identificar si es un comentario, una pregunta o una respuesta porque nunca pensé que podrías hacer eso. – Nathan

+0

Esto funciona bastante :) Solo estoy teniendo un pequeño problema al unirme a la tabla de preguntas para obtener la información de la pregunta para que pueda vincularse y todo eso. Aquí está el SQL y PHP: http://screencast.com/t/EJgdGkMPBB Por alguna razón, en los comentarios, parece mostrar la identificación de la pregunta como título y luego, para las respuestas, no muestra el título en absoluto: http: //screencast.com/t/qvDzliDs9U Soy consciente de que algunas cosas aún no están en '$ row ['qSlug']' y demás (que es la URL del título), pero eso no debería afectar las otras cosas – Nathan

+0

El nombre de la clave asociativa proviene del ** primer ** 'SELECCIONAR'. Primero debe seleccionar todas las columnas comunes ('id, created, q_id, q_title'), luego seleccione las columnas distintas last (' a.ans_id' y 'ac.id'). Esto no es un defecto - 'UNION' está diseñado para seleccionar los mismos datos. En cuanto al título en blanco, está usando 'qTitle' en lugar de' q_title'. – andrewtweber

1

Me gusta la "opción 2", básicamente estaría duplicando sus datos y ralentizaría un poco las cosas con las lecturas/escrituras extra. Tal vez en lugar de hacer una

SELECT q.*, a.*, ac.* 

Usted podría obtener sólo los datos que necesita de cada mesa, o de una manera un poco más limpio y será para un Union de las tres tablas, después de limitar la búsqueda a sólo aquellos mensajes por el usuario seleccionado, y ordenar por la fecha publicada.

+0

Esto parece ser una buena idea, pero en un bucle while cómo podría detectar si la acción es una respuesta, pregunta o comentario? Si puedo hacerlo, esto funcionará y podría decir: "{Usuario} comentó una respuesta en el Título de la pregunta" si es un comentario y luego "{Usuario} preguntó el Título de la pregunta" si es una pregunta, etc. – Nathan

+0

usted puede agregar una variable para el tipo, por ejemplo, en cada una de las sentencias de selección arrojar una cadena para lo que es: seleccione 'pregunta' como tipo_actividad, q.field1, etc. de ... –

Cuestiones relacionadas