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

Ordenar tabla por campo que se encuentra en otra tabla??

Estas en el tema de Ordenar tabla por campo que se encuentra en otra tabla?? en el foro de Bases de Datos General en Foros del Web. Hola buenas, tengo 2 tablas como las siguientes: DISCOS D_ID -- Grupo_ID -- D_Nombre -- D_Nota GRUPOS Grupo_ID -- NombreGrupo Y quisiera ordenar la Tabla ...
  #1 (permalink)  
Antiguo 11/12/2004, 13:17
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Ordenar tabla por campo que se encuentra en otra tabla??

Hola buenas, tengo 2 tablas como las siguientes:

DISCOS
D_ID -- Grupo_ID -- D_Nombre -- D_Nota

GRUPOS
Grupo_ID -- NombreGrupo

Y quisiera ordenar la Tabla DISCOS por el NombreGrupo (que pertenece a la tabla GRUPOS)

Cómo se hace esto??

Muchas graciasss
  #2 (permalink)  
Antiguo 11/12/2004, 16:35
 
Fecha de Ingreso: octubre-2004
Ubicación: COLOMBIA
Mensajes: 240
Antigüedad: 19 años, 6 meses
Puntos: 3
Información

DEBES SABER QUE DEBEN HABER CONCATENACIONES DE CAMPOS OSEA EL CAMPO GRUPO_ID DEBE SER LA LLAVE DEL OTRO
CON LA SENTENCIA ORDER BY ASI:

Código:
SELECT * FROM DISCOS
WHERE Grupo_ID = (SELECT Grupo_ID, NombreGrupo FROM GRUPOS
ORDER BY NombreGrupo);
CREO QUE ES ASI
OJALA TE SIRVA.
CHAO

Última edición por RadicalEd; 11/12/2004 a las 16:51
  #3 (permalink)  
Antiguo 12/12/2004, 07:26
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Mmm no me funciona. Tengo esto:
Código:
$result = mysql_query("SELECT * FROM Discos
    WHERE G_ID = '(select G_ID, G_Nombre FROM Grupos
    ORDER BY G_Nombre)'", $conexion);
$row = mysql_fetch_array($result)
No dá error, pero no hace bien lo que quiero.
G_ID es la Clave Primaria de Grupos pero una columna normal en Discos.

Última edición por apañero; 12/12/2004 a las 07:28
  #4 (permalink)  
Antiguo 13/12/2004, 10:19
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Prueba con algo así

SELECT Discos.*
FROM DISCOS INNER JOIN GRUPOS
on Discos.Grupo_ID = Grupo_ID
ORDER BY GRUPOS.NombreGrupo

Un saludo
  #5 (permalink)  
Antiguo 13/12/2004, 18:21
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Nada no lo consigo.
Tengo:
$result = mysql_query("SELECT Discos.*
FROM Discos INNER JOIN Grupos
on Discos.G_ID = G_ID
ORDER BY Grupos.G_Nombre", $conexion);
die ('Error por que: ' . mysql_error());

Y me dá el siguiente error:
Column: 'G_ID' in on clause is ambiguous


Y con:
$result = mysql_query("SELECT * FROM Discos
WHERE G_ID = '(select G_ID, G_Nombre FROM Grupos
ORDER BY G_Nombre)'", $conexion);
No me dá error, pero no me saca registros y el valor de $resultado es: Resource id #4
  #6 (permalink)  
Antiguo 14/12/2004, 01:40
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Fíjate el mensaje que te da: G_ID es ambigüo. Cuando da este error quiere decir que ese nombre de campo existe en más de un campo de la tabla y no sabe cual tomar. Ergo, esta es la solución a tu problema:
Código:
SELECT Discos.* 
FROM Discos INNER JOIN Grupos
on Discos.G_ID = Grupos.G_ID
ORDER BY Grupos.G_Nombre
Un saludo.
__________________
Estoy contagiado de Generación-I
  #7 (permalink)  
Antiguo 14/12/2004, 04:41
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Ok perfecto, pero 2 últimos casos diferentes para esa misma consulta:

1-Cómo sería la consulta pero que además seleccionara sólo los campos de la tabla Discos que tienen de autor a D_Autor='$autor' ???

2-Cómo sería la consulta pero que además sólo seleccionara los G_Nombre que empezaran por la letra A???


Venga muchas gracias por todo

Última edición por apañero; 14/12/2004 a las 20:12
  #8 (permalink)  
Antiguo 15/12/2004, 02:28
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
1.
Código PHP:
$SQL="SELECT Discos.* 
FROM Discos INNER JOIN Grupos
on Discos.G_ID = Grupos.G_ID
where d_autor='$autor'
ORDER BY Grupos.G_Nombre" 
2.
Código PHP:
$SQL="SELECT Discos.* 
FROM Discos INNER JOIN Grupos
on Discos.G_ID = Grupos.G_ID
where d_autor='$autor' and g_nombre like 'A%' 
ORDER BY Grupos.G_Nombre" 
Espero que te sirva.
Un saludo.
__________________
Estoy contagiado de Generación-I
  #9 (permalink)  
Antiguo 09/02/2005, 15:46
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Perfecto, pero una complicación más. Ahora son 3 tablas relacionadas (se añade la tabla letras):

DISCOS
D_ID -- Grupo_ID -- D_Nombre -- D_Nota

GRUPOS
Grupo_ID -- NombreGrupo

LETRAS
D_ID -- L_ID

Y se quiere ordenar las Letras por el Nombre del Grupo
¿cómo sería?
  #10 (permalink)  
Antiguo 09/02/2005, 19:06
Avatar de Potro  
Fecha de Ingreso: abril-2001
Mensajes: 2.249
Antigüedad: 23 años
Puntos: 39
jajaja no quieres que te hagan de una ves tu aplicación...
  #11 (permalink)  
Antiguo 10/02/2005, 04:58
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Creo que tienes un serio problema de desconocimiento del SQL, yo de tí me plantearía el leer y/o estudiar algo de SQL, porque estas preguntas son lo básido de consultas con SQL.
En este caso se hace igual que antes, pero sólo hay que añadir el cruce de la tabla letras con los discos:
Código PHP:
$SQL="SELECT letras.*
FROM Discos INNER JOIN Grupos
on Discos.G_ID = Grupos.G_ID inner join letras on discos.d_id=letras.d_id
where d_autor='$autor'
ORDER BY Grupos.G_Nombre" 
Un saludo.
__________________
Estoy contagiado de Generación-I
  #12 (permalink)  
Antiguo 10/02/2005, 06:10
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
sí sí un problema de desconocimiento grande además, pero bueno espero que con esto que me has puesto y con lo que lea por ahí me pueda ir apañando para lo que quiero.

muchas graciasss :P
  #13 (permalink)  
Antiguo 06/03/2005, 20:37
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Vice tengo prolemas con una consuta de ese tipo:

Código:
$result=mysql_query("select RelacionDiscoEstilo.* 
    FROM RelacionDiscoEstilo INNER JOIN Discos
    on RelacionDiscoEstilo.D_ID = Discos.D_ID
    where EST_ID='$estilos[$k]' AND EST_ID='$estilos[$n]'
    ORDER BY Discos.D_Fecha",$conexion);
Me funciona sin este: AND EST_ID='$estilos[$n]'
Imagina la tabla RelacionDiscoEstilo:
Código:
ID D_ID EST_ID
1    13      1
2    13      2
3    14      1
4    15      1
..    ..      ..
Lo que quiero es sacar el D_ID que tenga EST_ID=1 y EST_ID=2 por ejemplo, que en este caso sería el D_ID=13.

Debo hacerlo mal porque no me lo saca :P

Última edición por apañero; 07/03/2005 a las 18:12
  #14 (permalink)  
Antiguo 07/03/2005, 04:16
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
La consulta está mal. No quieres los que tenga "Est_id=1 y Est_id=2" sino que tenga un valor o el otro:
Código:
$result=mysql_query("select RelacionDiscoEstilo.* 
    FROM RelacionDiscoEstilo INNER JOIN Discos
    on RelacionDiscoEstilo.D_ID = Discos.D_ID
    where EST_ID='$estilos[$k]' OR EST_ID='$estilos[$n]'
    ORDER BY Discos.D_Fecha",$conexion);
Un saludo.
__________________
Estoy contagiado de Generación-I

Última edición por Vice; 07/03/2005 a las 04:30
  #15 (permalink)  
Antiguo 07/03/2005, 18:17
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
No eso no me vale, quiero que se seleccionen los discos que tengan 2 Estilos determinados, sólo uno no me vale, quiero las D_ID que tengan por ejemplo EST_ID=1 y EST_ID=2 (que haya una fila en la que D_ID tenga ese estilo y otra fila en la que ese mismo D_ID tenga otro estilo determinado)

Ejemplo práctico:
Si la tabla es:
Código:
 
ID D_ID EST_ID
1   13       1
2   13       2
3   14       1
4   15       1
5   16       2
6   17       2
.. .. ..
Pues la consulta quiero que sea "SELECCIONAR TODAS LAS D_ID QUE TENGAN EST_ID=1 Y ADEMÁS EST_ID=2 (en otra fila claro)"

Y el resultado sería: D_ID=13 ya que es la única D_ID que posee los 2 EST_ID anteriores

Última edición por apañero; 07/03/2005 a las 18:19
  #16 (permalink)  
Antiguo 08/03/2005, 02:31
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Vale, entonces puedes probar esto:
Código:
select a.* 
    FROM RelacionDiscoEstilo a INNER JOIN Discos b
    on a.D_ID = b.D_ID inner join Discos c on b.d_id=c.d_id
    where b.EST_ID='$estilos[$k]' and c.EST_ID='$estilos[$n]'
    ORDER BY b.D_Fecha
Con esto he supuesto que el campo d_id está en la tabla discos, sino es así, la tabla que tienes que repetir es la otra.
Un saludo.
__________________
Estoy contagiado de Generación-I
  #17 (permalink)  
Antiguo 08/03/2005, 05:08
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
MMm no me devuelve resultados (mysql_fetch_array(): supplied argument is not a valid MySQL result resource...) cuando debería.

Te pongo las 2 tablas implicadas:

CREATE TABLE Discos (
D_ID INT(7) NOT NULL auto_increment,
...
...
PRIMARY KEY (D_ID)
);

CREATE TABLE RelacionDiscoEstilo (
INDICE_ID INT(7) NOT NULL auto_increment,
D_ID INT(7) NOT NULL,
EST_ID INT(7) NOT NULL,
PRIMARY KEY (INDICE_ID)
);

Y la consulta es:
Código:
select a.* 
    FROM RelacionDiscoEstilo a INNER JOIN Discos b
    on a.D_ID = b.D_ID inner join Discos c on b.D_ID=c.D_ID
    where b.EST_ID='$estilos[$k]' and c.EST_ID='$estilos[$n]'
    ORDER BY b.D_Fecha
Bueno a ver si ves tú algo.
muchas thenkiuss

Última edición por apañero; 08/03/2005 a las 05:09
  #18 (permalink)  
Antiguo 08/03/2005, 07:26
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
El problema está en el comentario que te dije: EST_ID es de la otra tabla no de Discos:
Código:
select a.* 
    FROM RelacionDiscoEstilo a INNER JOIN Discos b
    on a.D_ID = b.D_ID inner join RelacionDiscoEstilo c on b.D_ID=c.D_ID
    where a.EST_ID='$estilos[$k]' and c.EST_ID='$estilos[$n]'
    ORDER BY b.D_Fecha
Un saludo.
__________________
Estoy contagiado de Generación-I
  #19 (permalink)  
Antiguo 14/03/2005, 19:15
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
Vice esto ya está casi acabado, ahora llega alguna consulta un pelín más complicada.
Resulta que quiero ordenar todos los Grupos por su media de nota de sus Discos. Por tanto se ven afectadas 2 tablas, Grupos y Discos, que son del estilo:

TABLE Grupos (
G_ID INT(7) NOT NULL auto_increment,
...
PRIMARY KEY (G_ID)
);

TABLE Discos (
D_ID INT(7) NOT NULL auto_increment,
G_ID INT(7) DEFAULT '0' NOT NULL,
D_Fecha DATE,
D_Nota DECIMAL( 5, 1 ) DEFAULT '0.0' NOT NULL,
...
PRIMARY KEY (D_ID)
);

Y lo que quiero es que saque los 10 Grupos (G_ID) que más media de nota (D_Nota) tengan de entre todos sus discos (D_ID,G_ID).
Yo vengo sumando la nota de todos sus discos y la divido entre el número de discos y saco luego el entero equivalente, pero seguro que se puede hacer más fácilmente sólo con una consulta en vez de estar con php y arrays y bastante código.

Ejemplo práctico:

Grupo G_ID=1 con 2 discos: D_ID=1 y D_ID=2 de nota 7.5 y 6 respect.
Grupo G_ID=2 con 3 discos: D_ID=1, D_ID=2 y D_ID=3 de nota 6 y 7 y 8 respect.
Grupo G_ID=3 con 1 discos: D_ID=1 de nota 7.5
Grupo G_ID=4 con 1 discos: D_ID=1 de nota 5
Grupo G_ID=5 con 1 discos: D_ID=1 de nota 8

Por tanto:
El Grupo 1 tendría de media: 6.75
El Grupo 2 tendría de media: 7
El Grupo 3 tendría de media: 7.5
El Grupo 4 tendría de media: 5
El Grupo 5 tendría de media: 8

Luego la consulta debería dar: G5,G3,G2,G1 y G4 (ordenados por su media de todos sus discos)
Podría introducir algún parámetro o regla más, pero de momento vamos a lo básico y luego ya seguiremos :P

venga graciasss.
  #20 (permalink)  
Antiguo 15/03/2005, 01:18
Avatar de Vice  
Fecha de Ingreso: agosto-2003
Mensajes: 613
Antigüedad: 20 años, 9 meses
Puntos: 2
Si sólo quieres obtener el identificador del grupo no es necesario cruzar las dos tablas (no has puesto en la tabla grupos nada más que el id).
De todas formas, supongo que tendrás un campo "nombre" del grupo en la tabla "grupos", así que lo que quieres hacer lo puedes poner así:
Código:
select grupo.nombre, avg (d_nota)
from grupos join discos on grupos.g_id=grupos.gid
groub by 1
order by 2
limit 0,10
Espero que esto te sirva.
Un saludo.

Recomendación: estudia el sql porque tienes lagunas, dudas, en lo básico.
__________________
Estoy contagiado de Generación-I
  #21 (permalink)  
Antiguo 14/05/2005, 20:44
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
una cosa, me está fallando la consulta que saca los discos en función de las medias de las valoraciones de los mismos. tengo algo como:

$result=mysql_query("select Discos.*, avg(ValoraDiscos.VD_Nota) FROM Discos join ValoraDiscos on Discos.D_ID = ValoraDiscos.D_ID GROUP by Discos.D_Disco ORDER by 2 DESC LIMIT 10",$conexion);

He probado muchas combinaciones de ORDER y de campos pero no me sale bien el orden, funciona pero mal. Quiero obtener todos los datos de cada disco (Discos.*) ordenados de más a menos nota media de valoracion (puede haber muchas notas para un sólo D_ID)

Por ejemplo hay un D_ID que tiene 2 valoraciones, una un ValoraDiscos.VD_Nota=7 y otra un ValoraDiscos.VD_Nota=8
que deberían dar más nota que un D_ID con nota 7 por ejemplo

Luego recojo los datos con
$row=mysql_fetch_array($result);
$ID=$row["D_ID"]...


Pero no sé qué pasa que sale mal ordenado :(
  #22 (permalink)  
Antiguo 16/05/2005, 08:53
 
Fecha de Ingreso: abril-2003
Ubicación: Madrid
Mensajes: 707
Antigüedad: 21 años
Puntos: 0
Ten en cuenta, que al poner el ORDER BY 2, estás ordenando por la segunda columna de la SELECT, y tienes un *, así que probablemente, esté ordenando por un campo de la tabla Discos

Un saludo
  #23 (permalink)  
Antiguo 16/05/2005, 13:46
 
Fecha de Ingreso: abril-2004
Mensajes: 310
Antigüedad: 20 años
Puntos: 0
ok lo resolví con
select Discos.D_ID, avg(ValoraDiscos.VD_Nota)....

thenkiussss

Última edición por apañero; 17/05/2005 a las 05:09
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:13.