Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

armar consulta para mostrar las opiniones mas...

Estas en el tema de armar consulta para mostrar las opiniones mas... en el foro de Mysql en Foros del Web. que tal forer@s quiero mostrar las opiniones mas debatidas que serian las mas comentadas y las mas populares que serian las que tienen mas visitas, ...
  #1 (permalink)  
Antiguo 02/02/2012, 20:09
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
armar consulta para mostrar las opiniones mas...

que tal forer@s

quiero mostrar las opiniones mas debatidas que serian las mas comentadas
y las mas populares que serian las que tienen mas visitas, no se como armar las consultas

necesito su consejo verán tengo las siguientes tablas:

opiniones
----------------
id_opinion
autor_op
fecha_op
hora_op
email_op
id_categoria_op
titulo_op
descripcion_op

la de los comentarios, que tiene de llave foránea el id_opinion:

replicas
----------------
id_replica
id_opinion
fecha_rep
hora_rep
nombre_rep
email_rep
comentario_rep

la del contador de visitas, que tiene tambien de llave foránea el id_opinion:

contador
-----------------
id_visto
ip_visto
num_visto
fecha_visto
id_opinion

se que debe llevar el order by pero como son 2 tablas diferentes no se como seria, la logica que necesito seria asi:

para mostrar las de mas comentarios

SELECT * FROM opiniones ORDER BY $num_comentarios WHERE id_opinion=$id_opinion

donde $num_comentarios seria el resultado de:

$NroComentarios=mysql_num_rows(mysql_query("SELECT id_opinion FROM replicas WHERE id_opinion='$id_opinion'"));

seria correcto???

y para mostrar los mas visitados seria algo parecido??

Gracias
  #2 (permalink)  
Antiguo 03/02/2012, 06:09
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: armar consulta para mostrar las opiniones mas...

Código MySQL:
Ver original
  1. SELECT op.id_opinion,
  2. op.autor_op,
  3. op.fecha_op,
  4. op.hora_op,
  5. op.email_op,
  6. op.id_categoria_op,
  7. op.titulo_op,
  8. op.descripcion_op,
  9. ifnull(numRep.numComentarios,0) comentarios
  10. opiniones op LEFT JOIN (SELECT id_opinion,
  11.                                     count(*) numComentarios
  12.                                     FROM replicas GROUP BY id_opinion) numRep
  13.                 ON op.id_opinion=numRep.id_opinion
  14. ORDER BY ifnull(numRep.numComentarios,0) DESC;

Para las visitas seria algo similar....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 03/02/2012, 12:49
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: armar consulta para mostrar las opiniones mas...

hola quimfv, gracias por tu respuesta, si funciona bien pero tengo algunas dudas sobre la consulta,

en la consulta entiendo lo que haces aqui:

SELECT op.id_opinion, op.autor_op, op.lugar_op, op.fecha_op, op.hora_op, op.email_op, op.id_categoria_op, op.titulo_op, op.descripcion_op,

estas seleccionando los campos que se mostraran, pero en esta linea ya me perdi:

ifnull(numRep.numComentarios,0)

no entiendo de donde sacas numRep.numComentarios, me imagino que es un tipo alias y despues pones

comentarios FROM opiniones op

no se a que te refieres con comentarios, igual no se si es un alias

Gracias

Última edición por catpaw; 03/02/2012 a las 13:10
  #4 (permalink)  
Antiguo 03/02/2012, 14:10
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: armar consulta para mostrar las opiniones mas...

otra duda, es que mira para sacar el numero de visitas que tiene cada opinion no lo hago con un count, lo hago sumando:

Código PHP:
<?php
$fila_pop
=mysql_fetch_array(mysql_query("SELECT SUM(num_visto) FROM contador WHERE id_opinion='$id_opinion_pop'")); 
$NroVisitas_pop=$fila_pop[0];
echo 
$NroVisitas_pop;
?>
y entonces así cambiaría la consulta que me funciona bien para los comentarios pero en este caso seria diferente, acá te dejo la tabla con los valores que tiene actualmente, deberían salir las opiniones en este orden:

opinion id 1 -> 3 visitas
opinion id 2 -> 2 visitas
opinion id 4 -> 1 visita
opinion id 6 -> 1 visita

id_visto__ ip_visto__ num_visto____ fecha_visto__________ id_opinion
1_______ 127.0.0.1_______ 2_______ 2012-02-03 13:30:23_______ 2
2_______ 127.0.0.2_______ 1_______ 2012-02-02 18:29:57_______ 1
3_______ 127.0.0.1_______ 2_______ 2012-02-03 13:26:11_______ 1
4_______ 127.0.0.1_______ 1_______ 2012-02-03 13:17:35_______ 6
5_______ 127.0.0.1_______ 1_______ 2012-02-03 13:30:45_______ 4

Gracias
  #5 (permalink)  
Antiguo 04/02/2012, 10:40
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: armar consulta para mostrar las opiniones mas...

Hola mira intente adaptar la consulta que me dejaste para los comentarios y saque esto:

Código PHP:
$sql_query_pop="SELECT op.id_opinion, op.autor_op, op.lugar_op, op.fecha_op, op.hora_op, op.email_op, op.id_categoria_op, op.titulo_op, op.descripcion_op FROM opiniones op LEFT JOIN (SELECT SUM(ct.num_visto) FROM contador ct) ON op.id_opinion=ct.id_opinion ORDER BY ct.num_visto DESC LIMIT 0,4"
pero me sale un error y es que ademas yo se que no es correcto, no se como se tenga que hacer, necesito:

que muestre todos los campos de la tabla opiniones donde sume num_visto de la tabla contador donde el id_opinion (tabla opiniones) sea igual al id_opinion (tabla replicas) ordenado por el resultado de la suma de num_visto descendiente limite 0,4

yo se que esta complicado espero me puedan apoyar

Gracias
  #6 (permalink)  
Antiguo 06/02/2012, 02:37
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: armar consulta para mostrar las opiniones mas...

SELECT op.id_opinion,
op.autor_op,
op.fecha_op,
op.hora_op,
op.email_op,
op.id_categoria_op,
op.titulo_op,
op.descripcion_op,

/// Efectivamente es la lista de campos

ifnull(numRep.numComentarios,0) comentarios

/// Numero de replicas (si, numRep.numComentarios es un alias)
/// La funcion Ifnull pasa los nulos a cero
/// al resultado se le da el alias "comentarios"


FROM
opiniones op LEFT JOIN

/// Por el left join consigo que me muestre todas las opiniones tengan o no replicas

(SELECT id_opinion,
count(*) numComentarios
FROM replicas
GROUP BY id_opinion) numRep

///Subconsulta, con alias numRep, que me da el numero de replicas por cada opinion, fijate que retorna dos campos el id_opinion para poder relacionar con la otra tabla y el count(*) con alias numComentarios


ON op.id_opinion=numRep.id_opinion

//Clausula ON que relaciona la tabla opiniones (alias op) con la subconsulta con alias numRep por el campo id_opinion

ORDER BY ifnull(numRep.numComentarios,0) DESC;

//// Ordeno en orden inverso (DESC, mayor a menor) por el numero de replicas.

Otras dudas...

No se como consigues ese num_visto

1_______ 127.0.0.1_______ 2_______ 2012-02-03 13:30:23_______ 2

esto significa que la opinion 2 se ha visitado 2 veces en el segundo 23 del minuto 30.... muy fino el contador...

No seria mas logico guardar un registro por visita?...

Tu adaptación de la consulta

SELECT
op.id_opinion,
op.autor_op,
op.lugar_op,
op.fecha_op,
op.hora_op,
op.email_op,
op.id_categoria_op,
op.titulo_op,
op.descripcion_op,

Te falta el numero de visitas... no?

sbcVisitas.visitas


FROM opiniones op LEFT JOIN


(SELECT SUM(ct.num_visto)
FROM contador ct)

Esta subconsulta retorna la suma de todos los vum_visto, y ademas no esta el campo id_opinion por lo que no se puede relacionar con la tabla opiniones

Toda subconsulta debe tener su alias

sunbstituyela por

(SELECT ct.id_opinion,SUM(ct.num_visto) visitas
FROM contador ct
GROUP BY ct.id_opinion) sbcVisitas

ON op.id_opinion=ct.id_opinion

La relacion es entre la tabla y la subconsulta luego debes cambiar los alias

ON op.id_opinion=sbcVisitas.id_opinion

ORDER BY ct.num_visto DESC LIMIT 0,4";

idem

ORDER BY sbcVisitas.visitas DESC LIMIT 0,4;
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 06/02/2012 a las 02:46
  #7 (permalink)  
Antiguo 07/02/2012, 13:30
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: armar consulta para mostrar las opiniones mas...

que tal quimfv, gracias por tu explicacion, ya me quedo mucho mas claro el asunto

Cita:
No se como consigues ese num_visto
mira normalmente ya conozco el id de cada opinión que muestro de acuerdo a la consulta simple

SELECT * FROM opiniones LIMIT 0,4 donde mediante un:

while($row_pop=mysql_fetch_array($res_pop, MYSQL_ASSOC)){

voy recogiendo los valores de cada opinion,

$id_opinion_pop=$row_pop['id_opinion'];

para cada opinion muestro cuantas visitas tiene, con la siguiente consulta:

SELECT SUM(num_visto) FROM contador WHERE id_opinion='$id_opinion_pop'

las tablas que interaccionan aqui son:

opiniones
----------------
id_opinion
autor_op
fecha_op
hora_op
email_op
id_categoria_op
titulo_op
descripcion_op


contador
-----------------
id_visto
ip_visto
num_visto
fecha_visto
id_opinion

Cita:
No seria mas logico guardar un registro por visita?...
según yo así lo hago, mira acá en la tabla contador se guarda la id de la opinion visitada y los datos de la visita que son un id, la ip, el numero de visitas y la fecha/hora (si coincide la ip y han pasado mas de 5 horas, le suma uno al valor que tenga el campo num_visto y actualiza la fecha y hora, de lo contrario no cuenta la visita)

por ejemplo te ponia los valores que tengo de prueba en la tabla contador:

id_visto__ ip_visto__ num_visto____ fecha_visto__________ id_opinion
1_______ 127.0.0.1_______ 2_______ 2012-02-03 13:30:23_______ 2
2_______ 127.0.0.2_______ 1_______ 2012-02-02 18:29:57_______ 1
3_______ 127.0.0.1_______ 2_______ 2012-02-03 13:26:11_______ 1
4_______ 127.0.0.1_______ 1_______ 2012-02-03 13:17:35_______ 6
5_______ 127.0.0.1_______ 1_______ 2012-02-03 13:30:45_______ 4

como podras darte cuenta la id de la opinion 1 se repite, lo que significaria que se vio 1 una vez por la ip 127.0.0.2 y dos veces por la ip 127.0.0.1, entonces para obtener el numero de visitas de la opinion 1 se deben sumar el 1 y el 2 del campo num_visto donde las ip sean iguales, en este caso a 1.



entonces lo que necesito es en una sola consulta tener los resultados de:

-> SELECT * FROM opiniones
-> SELECT SUM(num_visto) FROM contador WHERE id_opinion='$id_opinion_pop'

***mostrados de acuerdo al numero de visitas DESC***
perooooo teniendo en cuenta que ya no sabre de antemano la $id_opinion_pop



de verdad muchas gracias por la ayuda

Última edición por catpaw; 07/02/2012 a las 13:40
  #8 (permalink)  
Antiguo 08/02/2012, 06:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: armar consulta para mostrar las opiniones mas...

Se ha duplicado el mensaje
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.

Última edición por quimfv; 08/02/2012 a las 06:28
  #9 (permalink)  
Antiguo 08/02/2012, 06:21
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 1 mes
Puntos: 574
Respuesta: armar consulta para mostrar las opiniones mas...

Código MySQL:
Ver original
  1. SELECT ...lista de todos los campos de opinion...
  2. ifnull(numVisitas.num,0) visitas
  3. opiniones op LEFT JOIN (SELECT id_opinion,
  4.                                     SUM(num_visto) num
  5.                                     FROM contador
  6.                                     GROUP BY id_opinion) numVisitas
  7.                 ON op.id_opinion=numRep.id_opinion
  8. ORDER BY ifnull(numVisitas.num,0) DESC;

No te hace falta saber de antemano que opinion buscas porque por el group by suma todas las visitas agrupadas por opiniones....
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #10 (permalink)  
Antiguo 08/02/2012, 12:26
Avatar de catpaw  
Fecha de Ingreso: mayo-2010
Ubicación: xalapa
Mensajes: 856
Antigüedad: 13 años, 11 meses
Puntos: 23
Respuesta: armar consulta para mostrar las opiniones mas...

quimfv de verdad muchas gracias por la ayuda!!

ya quedo la consulta, solo marcaba un error aca pero lo demas todo bien

ON op.id_opinion=numRep.id_opinion

lo remplace por numVisitas y todo listo!!

Gracias

Etiquetas: armar, opiniones, query, select, tabla
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 05:19.