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

Meter varios datos en un campo

Estas en el tema de Meter varios datos en un campo en el foro de Mysql en Foros del Web. Buenas, mi problema es el siguiente. He de insertar en una variable el resultado de una SELECT... pero esa SELECT puede devolver más de un ...
  #1 (permalink)  
Antiguo 06/03/2010, 11:18
 
Fecha de Ingreso: marzo-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Meter varios datos en un campo

Buenas, mi problema es el siguiente. He de insertar en una variable el resultado de una SELECT... pero esa SELECT puede devolver más de un valor, en ese caso me provoca un error en el procedimiento, y si añado un SOME para que capture todos los valores, tambien provoca un error al intentar meterlos en una unica variable. El fragmento de codigo es el siguiente:

set ocupada = (SELECT butaca.idBut
FROM butaca, venta, tarifa
where idBut = venta.codBut and
butaca.codTar = tarifa.idTar and
venta.codSes = sesion
group by idBut);
  #2 (permalink)  
Antiguo 06/03/2010, 13:34
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Meter varios datos en un campo

Tu problema es que estás confundiendo MySQL con SQL Server...
MySQL no tiene un tipo de dato TABLE ni tampoco FIELD, por lo que no puede crear una variable que tenga esas características. Lo que se debe hacer en ese caso es crear una variable para cada dato que estás recogiendo con la consulta, si la consulta devuelv eun único registro, o usar un cursos y un ciclo de procesado, si lo que devuelve es una tabla.
Eso si no quieres una tabla directamente como salida...

Explica un poco mejor qué es lo que se supone que debes hacer, y veremos de aconsejarte cómo lograrlo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 06/03/2010, 13:41
Colaborador
 
Fecha de Ingreso: marzo-2008
Ubicación: Cáceres
Mensajes: 3.735
Antigüedad: 16 años
Puntos: 300
Respuesta: Meter varios datos en un campo

Tienes al menos dos opciones, si lo que quieres es pasarlo en una variable de texto:
1) traerte la lista de datos como una cadena de texto. Para eso puedes usar GROUP_CONCAT()
SELECT GROUP_CONCAT(butaca.idBut ORDER BY idBut) butacasvendidas
FROM butaca INNER JOIN venta ON butaca.idBut =venta.codBut INNER JOIN tarifa ON
butaca.codTar = tarifa.idTar WHERE
venta.codSes = sesion
Así deberías poder descargarte, por medio del alias butacasvendidas, la lista de butacas separadas por coma.

2) La otra opción sería con programación, y el objetivo es el mismo, reunir en una cadena de texto la lista de butacas que obtienes de esa consulta. Pero eso debes preguntarlo en el foro de programación correspondiente.

De todas formas, si cargas los datos de la consulta en un array, podrás tenerlos todos y manejarlos. Es lo que suele hacerse.
  #4 (permalink)  
Antiguo 06/03/2010, 14:39
 
Fecha de Ingreso: marzo-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Meter varios datos en un campo

Se trata de una Base de Datos de un Teatro.
Bueno, para empezar tengo tres entidades:

/*TABLA TARIFA*/
create table tarifa
(
idTar char(3) primary key not null,
sit enum("Patio de Butacas","Butacas Club","Butacas de Anfiteatro"),
prec tinyInt unsigned not null
)engine = innodb;


/*TABLA BUTACA*/
create table butaca
(
idBut tinyInt unsigned primary key,
codTar char(3),
foreign key (codTar) references tarifa (idTar)
)engine = innodb;


/*TABLA VENTA*/
create table venta
(
codBut tinyInt unsigned not null,
codSes char(3) not null,

primary key (codBut, codSes),

foreign key (codBut) references butaca (idBut),
foreign key (codSes) references sesion (idSes)
)engine = innodb;

En la tabla butacas aparecen las butacas totales del teatro (codigo de butaca y codigo de tarifa).
En la tabla venta aparecen las ventas de las butacas y la sesión para la que se han vendido.
Y en la tabla tarifa aparece el precio dependiendo de donde esta situada la butaca.

Lo que estoy intentando es, mediante un procedimiento al que se le pasa el codigo de sesión (S01, S02, S03 o S04) me saque un listado de las butacas, su precio y si estan o no ocupadas para esa sesión.

El fragmento que he mandado es una SELECT que me lista las butacas ocupadas para una determinada sesión. Lo que resta es que en el listado de butacas totales me saque otro campo (al que he llamado "libre") con "Si" o "No" dependiendo del estado de la butaca.
Aqui pongo el procedimiento entero, lo unico que me falla es el error que he comentado antes.

create procedure butacas_libres (in sesion char(3))
begin

declare libre int;
declare ocupada int;

set ocupada = (SELECT butaca.idBut FROM butaca, venta, tarifa WHERE idBut = venta.codBut and butaca.codTar = tarifa.idTar and venta.codSes = sesion GROUP BY idBut);

if (SELECT butaca.idbut = ocupada FROM butaca) then
set libre = "NO";
else
set libre = "SI";
end if;

SELECT butaca.idBut, tarifa.prec, libre;

end;
$$ delimiter;

call butacas_libres("S01");


Espero que no sea muy lioso, hace poco que he empezado por mi cuenta y quizás algunas cosas no las hago como pudiera estar establecido.
  #5 (permalink)  
Antiguo 06/03/2010, 15:04
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Meter varios datos en un campo

Para hacerlo como te propones, en un stored procedure, debes usar cursores y handlers.
O bien hacerlo en una sola consulta...:
Código MySQL:
Ver original
  1. SELECT B.idBut, T.prec, IF(V.codBut IS NULL,'NO','SI') libre
  2.   butaca B
  3.   INNER JOIN tarifa T ON B.codTar = T.idTar
  4.   LEFT JOIN venta V ON B.idBut = V.codBut
  5.   V.codSes = sesion
  6. GROUP BY idBut;

Puede que haya que refinar el código, pero algo así debería ser suficiente.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 06/03/2010, 15:45
 
Fecha de Ingreso: marzo-2010
Mensajes: 3
Antigüedad: 14 años, 1 mes
Puntos: 0
Respuesta: Meter varios datos en un campo

Es la primera vez que oigo hablar de cursores y handlers, y tampoco conozco la funcion de Join, como he dicho llevo poco tiempo y se lo basico. Revisaré los tutoriales que tengo a ver que encuentro. Lo he probado y casi me saca lo que pretendo, a ver si consigo terminarlo por mi mismo, ^^.
Gracias por la ayuda

Etiquetas: campos
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:02.