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

Como puedo ordenador esto?

Estas en el tema de Como puedo ordenador esto? en el foro de Mysql en Foros del Web. Hola.. a ver si alguien me orienta en como hacer esta sentencia: Tengo estas tablas: Código: book ---- id title vote ---- id book_id value ...
  #1 (permalink)  
Antiguo 10/04/2011, 13:37
 
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 16 años, 1 mes
Puntos: 1
Pregunta Como puedo ordenador esto?

Hola.. a ver si alguien me orienta en como hacer esta sentencia:

Tengo estas tablas:

Código:
book
----
id
title

vote
----
id
book_id
value

author
----
id
name

book_author
----
book_id
author_id
Lo que tengo es el "id" del autor, y lo que tengo que hacer es que me retorne los libros de este author, ordenados por los votos que tiene...

Por ejemplo, algo así para ordenar en funcion de los votos

Código:
ORDER BY (SUM(v.value) / COUNT(v)) GROUP BY v.book_id ..
y algo así para saber los libros de un autor:

Código:
SELECT b FROM Entity\Book b JOIN b.authors a WHERE a.id = {$author->id}
Pero no se como unirlo todo en una misma sentencia...

Estoy usando Doctrine 2 (se ve en la segunda sentencia), pero bueno.. primero tendré que saber como hacerlo en sql nativo para luego buscar la solución en Doctrine 2...

Gracias!
  #2 (permalink)  
Antiguo 11/04/2011, 02:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Como puedo ordenador esto?

No parece que busques votos sino una nota media

Cita:
SUM(v.value) / COUNT(v)
Esto te da la nota media de cada libro

Código MySQL:
Ver original
  1. SELECT book_id, SUM(v.value) / COUNT(*) as nota FROM vote v GROUP BY v.book_id;

esto de da la lista de titulos del autor elegido

Código MySQL:
Ver original
  1. SELECT b.id,b.title
  2. FROM book_autor ba
  3. INNER JOIN book b
  4. ON ba.book_id=b.id
  5. WHERE ba.author_id = {$author->id}


Ahora lo juntamos

Código MySQL:
Ver original
  1. Select b2.title, b1.nota
  2.     (SELECT book_id, SUM(v.value) / COUNT(*) as nota
  3.       FROM vote v GROUP BY v.book_id) as b1
  4.     (SELECT b.id,b.title
  5.      FROM book_autor ba
  6.      INNER JOIN book b
  7.         ON ba.book_id=b.id WHERE ba.author_id = {$author->id}) as b2
  8. ON b2.id=b1.book_id
  9. ORDER BY b1.nota DESC


Si fueran votos seria mas facil pero luego no tendria sentido el campo value de vote.
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #3 (permalink)  
Antiguo 11/04/2011, 09:50
 
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Como puedo ordenador esto?

Hola quimfv, muchas gracias.

Sí, quizás no me expresé bien, hay que ordenarlo tal y como hiciste, según la nota media en función de los votos.

Solo voy ha hacer un pequeño cambio en tú código, en vez de:

Código:
INNER JOIN
utilizaré

Código:
RIGHT JOIN
Ya que cabe la posibilidad de que hayan libros sin votos, y también quiero listarlos.

..y ya que estamos.. ¿te parece bien la estructura de datos? o ¿quizás lo hice demasiado complicado?

Gracias de nuevo
  #4 (permalink)  
Antiguo 12/04/2011, 01:33
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Sabadell
Mensajes: 4.897
Antigüedad: 16 años, 8 meses
Puntos: 574
Respuesta: Como puedo ordenador esto?

Correcta tu modificación.

La estructura me parece bien... soporta una relación n:m entre autores y libros... no todos los libros tienen un solo autor ....

Bien no creo que se tenga que tocar nada...

No se como controlas el numero de veces que puede votar/valorar un mismo usuario... es dificil si no se loguean previamente...
__________________
Quim
--------------------------------------------------
Ayudar a ayudar es una buena práctica!!! Y da buenos resultados.
  #5 (permalink)  
Antiguo 12/04/2011, 04:42
 
Fecha de Ingreso: octubre-2008
Mensajes: 69
Antigüedad: 16 años, 1 mes
Puntos: 1
Respuesta: Como puedo ordenador esto?

Hola quimfv.

Efectivamente los usuarios deben loguearse para poder votar.

Gracias por todo, lástima que no te puedo dar más karma, por lo visto te debí dar hace poco.. jeje

Etiquetas: doctrine2
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 03:52.