Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Mostrar en un DBGRID Relacion Muchos Muchos (https://www.clubdelphi.com/foros/showthread.php?t=63365)

dmassive 11-02-2009 12:28:10

Mostrar en un DBGRID Relacion Muchos Muchos
 
Es un juego de rol...

El Nivel de habilidades de los personajes son:
id=descripcion
1=Malo
2=Regular
3=Bueno
tanto el numero como su descripcion me son necesarios guardar en la base de datos y por lo tanto uso dos tablas:

TABLA 1 personajes:
id_personaje (Entero)
nombre (Cadena)
id_habilidad_volar (Entero)
id_habilidad_saltar (Entero)
id_habilidad_correr (Entero)

TABLA 2 habilidades:
id_habilidad (Entero)
descripcion (Cadena)

y armo un DBGrid, y quiero que me muestre el personaje, y el nivel de su habilidad:

El DBGrid se ve asi:
||| Personajes ||| Habilidad Volar |||
||| Mago ||| Regular |||
||| Guerrero ||| Malo |||
||| Hada ||| Bueno |||

Codigo:
Código:

SELECT nombre, id_habilidad_volar, habilidades.descripcion
FROM personajes
INNER JOIN habilidades
ON personajes.id_habilidad_volar = habilidades.id_habilidad
ORDER BY nombre

Pero estos personajes tienen muchas habilidades, entonces quiero que el DBGrid se vea asi:
||| Personajes ||| Habilidad Volar ||| Habilidad Saltar ||| Habilidad Correr |||
||| Mago ||| Regular ||| Malo ||| Bueno |||
||| Guerrero ||| Malo ||| Bueno ||| Regular |||
||| Hada ||| Bueno ||| Malo ||| Bueno |||

y aqui no se como plantearlo... la solucion rapida es usar un StringGrid y cargar los datos uno por uno XD
pero creo que podria hacer una consulta SQL que me permitiera hacer esto en un solo paso.

¿Alguna Sugerencia? Gracias!

Neftali [Germán.Estévez] 11-02-2009 13:12:29

Utiliza tres veces la tabla HABILIDADES en la SQL haciendo INNER JOIN con la tabla PERSONAJES, pero utilizando Alias junto a la tabla, para que la consulta salga correctamente.
De paso una una Alias para PERSONAJES (p).

Código SQL [-]
... 
INNER JOIN habilidades h1 ON p.habilidad_volar=h1.id_habilidad
INNER JOIN habilidades h2 ON p.habilidad_volar=h2.id_habilidad
INNER JOIN habilidades h3 ON p.habilidad_volar=h3.id_habilidad
...

Neftali [Germán.Estévez] 11-02-2009 13:15:38

Algo así:

Código SQL [-]
Select p.id_personaje, p.nombre, 
h1.id_habilidad_volar VOLAR, 
h2.id_habilidad_saltar SALTAR, 
h3.id_habilidad_correr CORRER 
from personajes p
INNER JOIN Habilidades h1 on p.id_habilidad_volar=h1.id_habilidad
INNER JOIN Habilidades h2 on p.id_habilidad_saltar=h2.id_habilidad
INNER JOIN Habilidades h3 on p.id_habilidad_correr=h3.id_habilidad
order by nombre

Pruebalo, tal vez me de dejado algo...

dmassive 12-02-2009 06:04:49

Probe utilizando alias, primero con uno y va bien:
Código SQL [-]
SELECT p.id_personaje, p.nombre,
h1.descripcion AS volar
FROM personajes p
INNER JOIN habilidades h1 ON p.id_habilidad_volar = h1.id_habilidad
ORDER BY nombre

Pruebo añadir una segunda habilidad y da error:
Código SQL [-]
SELECT p.id_personaje, p.nombre,
h1.descripcion AS volar,
h2.descripcion AS saltar
FROM personajes p
INNER JOIN habilidades h1 ON p.id_habilidad_volar = h1.id_habilidad
INNER JOIN habilidades h2 ON p.id_habilidad_saltar = h2.id_habilidad
ORDER BY nombre
El Error es:
Cita:

Error de sintaxis (falta operador) en la expresion de consulta 'p.id_habilidad_volar = h1.id_habilidad INNER JOIN habilidades h2 ON p.id_habilidad_saltar = h2.id_habilidad'

Neftali [Germán.Estévez] 12-02-2009 10:09:30

¿Qué base de Datos utilizas?
¿Has probado a lanzar la consulta directamente a la Base de Datos?

dmassive 12-02-2009 17:54:38

La base de datos esta hecha con MS Access 2003, corriendo Delphi 7 usando ADO.

Pero efectivamente la consulta funciona, porque la probe con MySQL (con PHP) y PySQLite (con Python) y da lo resultados que quiero... pero en Access no le encuentro la vuelta. :confused:

dmassive 12-02-2009 18:55:19

Luego de mucho buscar consultas SQL en access encontre algo en este thread que me sirvio como guia para intentar resolver este tema.

La solucion era anidar los INNER JOIN con parentesis por la tanto la consulta queda asi:
Código SQL [-]
SELECT p.id_personaje, p.nombre,
h1.descripcion AS volar,
h2.descripcion AS saltar,
h3.descripcion AS correr
FROM ((personajes p
INNER JOIN habilidades h1 ON p.id_habilidad_volar = h1.id_habilidad)
INNER JOIN habilidades h2 ON p.id_habilidad_saltar = h2.id_habilidad)
INNER JOIN habilidades h3 ON p.id_habilidad_correr = h3.id_habilidad
ORDER BY nombre

Muchas Gracias Neftali por tu ayuda!


La franja horaria es GMT +2. Ahora son las 09:32:22.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi