Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Ordenar una consulta

Estas en el tema de Ordenar una consulta en el foro de PHP en Foros del Web. Buenas compañeros, os planteo lo siguiente... Tengo una tabla (actores) que almacena actores (id_ac, nombre y apellidos), otra tabla (películas) que almacena películas (id_pel, título, ...
  #1 (permalink)  
Antiguo 03/07/2013, 03:26
 
Fecha de Ingreso: julio-2013
Mensajes: 44
Antigüedad: 8 años, 6 meses
Puntos: 0
Ordenar una consulta

Buenas compañeros, os planteo lo siguiente...

Tengo una tabla (actores) que almacena actores (id_ac, nombre y apellidos), otra tabla (películas) que almacena películas (id_pel, título, fechaestreno) y una tabla (pelisactores) que utilizo para relacionar los actores que trabajan en una película (id_pelac, id_pel, id_ac)

Quiero saber los actores que trabajan en una película

Supongamos que tenemos almacenados en la tabla actores a:
Robert De Niro (id_ac: 15)
Jason Statham (id_ac: 21)
Clive Owen (id_ac: 22)

Y en la tabla pelisactores tenemos:
(id_pelac: 31, id_pel: 10, id_ac:21)
(id_pelac: 32, id_pel: 10, id_ac:22)
(id_pelac: 33, id_pel: 10, id_ac:15)

Si quiero saber los actores que trabajan en una película (en este ej. la película con id_pel: 10) realizo la siguiente consulta:
"SELECT id_ac FROM pelisactores WHERE id_pel = 10"
y así obtengo que los actores que trabajan en esa película son 21, 22 y 15 (Jason, Clive y Robert) por ese orden, ya que se ordenan por id_pelac (31, 32 y 33)

Si quiero obtener directamente los nombres de los actores que trabajan en la película, realizo la siguiente consulta:
"SELECT id_ac, nombre, apellidos FROM actores WHERE id_ac IN
(SELECT id_ac FROM pelisactores WHERE id_pel = 10)"
y así obtengo los nombres de los actores que son 15, 21 y 22 (Robert, Jason y Clive) por este orden, ya que se ordenan por id_ac

Quisiera mantener el orden de la subconsulta en el resultado final, es decir, quiero que se muestren los actores por este orden: Jason, Clive y Robert

¿Se puede hacer en una consulta SQL?

Gracias
  #2 (permalink)  
Antiguo 03/07/2013, 03:34
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 10 años, 5 meses
Puntos: 34
Respuesta: Ordenar una consulta

Utiliza ORDER BY para definir como se ordenará.

Saludos.
  #3 (permalink)  
Antiguo 03/07/2013, 03:42
 
Fecha de Ingreso: julio-2013
Mensajes: 44
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Ordenar una consulta

Ya lo hice y el resultado es el mismo, así es como lo pongo...

"SELECT id_ac, nombre, apellidos FROM actores WHERE id_ac IN
(SELECT id_ac FROM pelisactores WHERE id_pel = 10 ORDER BY pel_ac)"

Y no da el resultado que quiero...
  #4 (permalink)  
Antiguo 03/07/2013, 03:55
Avatar de Karmac  
Fecha de Ingreso: agosto-2011
Ubicación: Bilbao
Mensajes: 196
Antigüedad: 10 años, 5 meses
Puntos: 34
Respuesta: Ordenar una consulta

Tendrías que ponerlo en la consulta principal, la subconsulta ahí tan solo son datos, los va a utilizar sin importar el nombre.

Saludos.
  #5 (permalink)  
Antiguo 03/07/2013, 04:01
 
Fecha de Ingreso: julio-2013
Mensajes: 44
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Ordenar una consulta

Sí, pero en la consulta principal sólo puedo ordenar por id_ac, nombre o apellidos y no me sirve, quiero que el resultado final sea el de la subconsulta, quiero que el resultado sea 21, 22 y 15 (Jason, Clive y Robert) y con un ORDER BY en la consulta principal no lo consigo.
  #6 (permalink)  
Antiguo 03/07/2013, 19:50
Avatar de leo_garay91  
Fecha de Ingreso: mayo-2012
Ubicación: argentina
Mensajes: 51
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Ordenar una consulta

si vos queres ordenar de esa forma tendrias q buscar ordenalos intercalando los registro, me parece, como hacerlo ni idea...
por que no se puede hacerlo mediante ASC ni con DESC....
  #7 (permalink)  
Antiguo 03/07/2013, 20:31
Avatar de carlos_belisario
Colaborador
 
Fecha de Ingreso: abril-2010
Ubicación: Venezuela Maracay Aragua
Mensajes: 3.156
Antigüedad: 11 años, 9 meses
Puntos: 461
Respuesta: Ordenar una consulta

en realidad yo no haría una subconsulta, sino mas bien pensaría en hacer un join, algo así

Código SQL:
Ver original
  1. SELECT id_ac, nombre, apellidos FROM actores a INNER JOIN pelisactores p ON(a.id_ac = pel_ac) WHERE WHERE id_pel = 10;

verifica y ahí puedes hacer el order que quieras de cualquiera de las dos tablas, saludos
__________________
aprende d tus errores e incrementa tu conocimientos
it's not a bug, it's an undocumented feature By @David
php the right way
  #8 (permalink)  
Antiguo 04/07/2013, 03:26
 
Fecha de Ingreso: julio-2013
Mensajes: 44
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Ordenar una consulta

Buenas compañeros...

No se utilizar el join... he modificado el SELECT que has propuesto para que no me de errores, quedaría así:

"SELECT nombre, apellidos FROM actores a INNER JOIN pelisactores p ON (a.id_ac = id_pelac) WHERE id_pel = 10"

He quitado id_ac al principio porque me daba error (Column 'id_ac' in field list is ambiguous). Dentro del paréntesis he modificado pel_ac por id_pelac y he quitado un WHERE.

He estado probando con varios casos, id_pel = 10, 11, 12, 13... hay veces que el SELECT no da ningún resultado, otras veces mezcla actores de varias películas...

No se cómo hacer para presentar los datos en el orden que yo quiera de cualquiera de las dos tablas...
  #9 (permalink)  
Antiguo 04/07/2013, 14:52
Avatar de leo_garay91  
Fecha de Ingreso: mayo-2012
Ubicación: argentina
Mensajes: 51
Antigüedad: 9 años, 8 meses
Puntos: 0
Respuesta: Ordenar una consulta

hola prueba con esto...
Código SQL:
Ver original
  1. SELECT a.id_ac, a.nombre, a.apellidos FROM actores a  
  2. JOIN pelisactores p ON a.id_ac = p.id_ac
  3. WHERE  p.id_pel = 10
  4. ORDER BY id_ac   --ordena por id actores
  5.             a.nombre --ordena por nombre de actores de a-z
  6.             a.apellidos --ordena por apellido  de a-z
  7.                             -- si quieres que te ordene de forma desentente agregas DESC

mira una explicacion del JOIN [URL="http://3.bp.blogspot.com/-GrTq1REkBgQ/UICzPFEX7sI/AAAAAAAAFng/EymrC-XayrU/s1600/sql.jpg"]imagen[/URL]
  #10 (permalink)  
Antiguo 04/07/2013, 15:05
Avatar de stramin  
Fecha de Ingreso: marzo-2008
Ubicación: Cubil felino
Mensajes: 1.652
Antigüedad: 13 años, 10 meses
Puntos: 336
Respuesta: Ordenar una consulta

No se que hace esto en el foro de PHP pero sería así:

Código MySQL:
Ver original
  1. SELECT id_ac, nombre, apellidos FROM actores,pelisactores
  2. WHERE pelisactores.id_ac=actores.id_ac AND id_pel = 10
  3. ORDER BY id_pelac

No te compliques con JOIN, esto puede hacerse con un SELECT normal.

O sea haces un select por ambas tablas y buscas las coincidencias entre ambas, luego solo filtras por la id de la pelicula.

Entonces puedes hacer el orden por id_pelac tal como querías al principio.
__________________
El objetivo de este foro es orientar al usuario como un favor y no como una obligación.

Yo soy de los que dan puntos por aporte :D
  #11 (permalink)  
Antiguo 04/07/2013, 15:44
 
Fecha de Ingreso: julio-2013
Mensajes: 44
Antigüedad: 8 años, 6 meses
Puntos: 0
Respuesta: Ordenar una consulta

Buenas compañeros,

Estuve esta tarde dándole vueltas y al final lo conseguí con un JOIN calcado al que has propuesto leo_garay91, este es el mío:

"SELECT nombre, apellidos FROM actores JOIN pelisactores ON pelisactores.id_ac = actores.id_ac AND pelisactores.id_pel = 10"

En lugar de WHERE en el mío puse AND y sin poner ORDER BY, puesto que el orden que quiero es el del id de pelisactores (id_pelac)

Muchas gracias leo_garay91!

Además he aprendido que también se puede hacer con un SELECT normal como el que has propuesto stramin, pero tengo que omitir el id_ac al principio del SELECT, de lo contrario me daría error (Column 'id_ac' in field list is ambiguous) y también puedo omitir el ORDER BY

Muchas gracias stramin!

Gracias también a carlos_belisario

Saludos a todos!

Etiquetas: sql
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 11:31.