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

consulta rompecabezas

Estas en el tema de consulta rompecabezas en el foro de Mysql en Foros del Web. buenas noches; estoy implementando un presupuestador para mi web.. y el caso es que la mejor forma de veo de estructurarme es la siguiente: titols(#id,^nom,...) ...
  #1 (permalink)  
Antiguo 09/08/2010, 16:59
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 8
consulta rompecabezas

buenas noches;

estoy implementando un presupuestador para mi web.. y el caso es que la mejor forma de veo de estructurarme es la siguiente:

titols(#id,^nom,...)
cont_form(#id,^variable,type_input,...)
form_select(#id,variable[fk-cont_form(variable)],opt,...)
cargador(id[fk-titols],variable[fk-cont_form(variable)],...)
precios(#id_titols[fk-titols(id)],#id_cont[fk-cont_form](id),#id_select[fk-form_select(id),PRECIO,...)

*leyenda
#primary key
^unique
campo[fk_tabla(campo)]

inserto titulos, esos titulos tienen en cargador una serie de registros, estos registros están obligatoriamente en la tabla cont_form , pero no necesariamente en la tabla form_select ya que form_select la uso solo para cuando el cont_form.type_input == select (en form_select tengo los diferentes opt que tienen los select que estoy creando, si fuese por ejemplo cont_form.type_input==text, no tendría ningún registro en esta tabla)
Cabe decir que en la tabla precios, el id_select se permite nulo(para poder poner registros que no estén en form_select[cont_form.type_input<>select], todo lo demás es not null.

una vez llegados a este punto, el problema que tengo es que para facilitar la escritura de la tabla precios(esta vacia), me gustaría que me regresara en una consulta(para hacerme un script que me facilite la tarea):
para todos los títulos, todos los registros de la tabla cargador, y si cont_form.type_input==select tendría que mostrar cada registro de la tabla cont_form referente al form_select.variable==cont_form.variable

resumen :
titols.nom,cont_form.variable,form_select.opt,prec ios.precio

lo mas cerca que creo que e estado es con...
Código:
select
t.nom,c.variable,s.opt from cont_form f
inner join form_select s on f.variable=s.variable
inner join carregador c on s.variable=c.variable
inner join titols t on t.id=c.id
order by t.id
pero si ago eso solo me devuelve los registros que están en la tabla form_select
Código:
form_select s on f.variable=s.variable
, los que no están, no son mostrados. Que la consulta si no me equivoco es correcta, lo que pasa es que necesito todos los campos de cont_form...

Si alguien que tuviera algo mas experiencia que yo en esto me echara una mano... lo agradecería.. :-p

pd:he obviado campos que creo que no eran necesarios para no marear mas.. por lo que igual parece que no es la mejor forma de hacerlo. Pido perdón por si no se entiende nada ... o por si se entiende demasiado (bucles de sobreinformación ) estoy abierto a todo tipo de sugerencias y criticas

Un saludo y gracias
  #2 (permalink)  
Antiguo 09/08/2010, 19:45
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 8 meses
Puntos: 214
Respuesta: consulta rompecabezas

hola
bueno, pues yo te sugeriría que pusieras nombres mas descriptivos a las tablas y las presentes un poco mejor, por ej

tipodocumento (id, descripcion)
documento (id, idtipodocumento,valor)

y tal vez agregando un gráfico o un ejemplo en texto sería
más fácil la comprensión de lo que tienes (puedes agregar imagenes con esto cuando estas escribiendo el mensaje (de pronto ya lo sabias pero por si acaso)

y pues en cuanto a lo que necesitas, probaste con left o right join?
puede que inner join no sea del todo lo que necesitas precisamente
por lo que comentas que algunas veces los datos no estaran por completo
en ambos lados, en cuyo caso estan las opciones de buscar en una u otra
tabla con los tipos de joins, si quieres ahondar mas en el tema pues date
un chapuzón en internet al respecto

saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #3 (permalink)  
Antiguo 10/08/2010, 05:53
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 8
Respuesta: consulta rompecabezas

hola mortiprogramador, gracias por tu respuesta,
aqui tienes una imagen para hacer un poco mas grafico el ejemplo


Los campos de cont_form pueden
ser usados en mas de un titol y no tendran
el mismo precio, por lo la idea es, teniendo esto,
meter estos registros talcual salen en una tabla precios
(identificandolos corectamente por el id.form_select)
para poder poner los valores que necesite



Bueno decir que creo que left join y right join no me pueden ayudar...
  #4 (permalink)  
Antiguo 10/08/2010, 11:54
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 8 meses
Puntos: 214
Respuesta: consulta rompecabezas

bueno, gracias por la gráfica, ahora bien, si entendi mejor el asunto,
pienso que la estructura de base de datos puede mejorarse (menos tablas por un lado, y por el otro las llaves serían numéricas)

pero pues tu problema actual es base de datos, porque?
bueno, no tenemos tu script de la creación y poblado de tablas, pero yo
en base a la imagen que pusiste, hice esto

Código MySQL:
Ver original
  1. nom varchar(20) not null, descripcio varchar(20) not null);
  2. type_input varchar(20) not null, variable varchar(20) not null);
  3. create table carregador (id int(2) not null, ordre int(2) not null,
  4. variable varchar(20) not null);
  5. variable varchar(20) not null, opt varchar(20) not null);
  6.  
  7. insert into titols (nom,descripcio) values
  8. ('llibres','llibres y revistes'),
  9. ('granformat','llibres y revistes'),
  10. ('targetes','llibres y revistes'),
  11. ('carteleria','llibres y revistes'),
  12. ('dispositivos_ele','llibres y revistes');
  13.  
  14. insert into cont_form (type_input,variable) values
  15. ('text','cantidad'),
  16. ('select','formato'),
  17. ('select','formato_digital'),
  18. ('select','incluye_portada');
  19.  
  20. insert into carregador (id,ordre,variable) values
  21. (4,1,'cantidad'),
  22. (4,2,'formato'),
  23. (4,3,'tipo_impresion'),
  24. (4,4,'plastificado'),
  25. (4,5,'tamaño_habierto'),
  26. (4,6,'hidden'),
  27. (4,7,'aceptar'),
  28. (5,1,'formato_digital'),
  29. (5,2,'cantidad'),
  30. (5,3,'hidden'),
  31. (5,4,'aceptar');
  32.  
  33. insert into form_select (variable,opt) values
  34. ('formato','normal'),
  35. ('formato','diptico'),
  36. ('formato','triptico'),
  37. ('formato_digital','cd'),
  38. ('formato_digital','dvd'),
  39. ('formato_digital','usb tarjeta');
  40.  
  41. y si uso la consulta más reciente publicada obtengo esto
  42.  
  43. +----+-----------------+----+
  44. | id | variable        | id |
  45. +----+-----------------+----+
  46. |  4 | formato         |  1 |
  47. |  4 | formato         |  2 |
  48. |  4 | formato         |  3 |
  49. |  5 | formato_digital |  4 |
  50. |  5 | formato_digital |  5 |
  51. |  5 | formato_digital |  6 |
  52. +----+-----------------+----+

ahora bien, analizemos por partes

tengo esto

Código MySQL:
Ver original
  1. select c.id, c.variable from cont_form f
  2. inner join carregador c on f.variable=c.variable
  3.  
  4. obteniendo
  5. +----+-----------------+
  6. | id | variable        |
  7. +----+-----------------+
  8. |  4 | cantidad        |
  9. |  4 | formato         |
  10. |  5 | formato_digital |
  11. |  5 | cantidad        |
  12. +----+-----------------+
  13.  
  14. y haciendo esto
  15.  
  16. select t.id, c.variable from carregador c
  17. inner join titols t on t.id=c.id
  18. inner join cont_form f on f.variable=c.variable
  19. order by t.id
  20.  
  21. se obtiene lo mismo,por ende es ausencia de datos lo que aquí ocurre,
  22. si hicieramos esto
  23.  
  24. insert into cont_form(type_input,variable) values
  25. ('select','cantidad'),
  26.  ('select','hidden');
  27.  
  28. y corremos cualquiera de las anteriores consultas,
  29. se obtiene esto:
  30.  
  31. +----+-----------------+
  32. | id | variable        |
  33. +----+-----------------+
  34. |  4 | cantidad        |
  35. |  4 | cantidad        |
  36. |  4 | formato         |
  37. |  4 | hidden          |
  38. |  5 | formato_digital |
  39. |  5 | cantidad        |
  40. |  5 | cantidad        |
  41. |  5 | hidden          |
  42. +----+-----------------+
  43.  
  44. y si quisieramos verlos sin repeticiones, bueno, con un group by bastaría
  45.  
  46. select c.id, c.variable from cont_form f
  47. inner join carregador c on f.variable=c.variable
  48. group by c.variable

sin embargo, si ejecutamos la consulta inicial (los inners) pues sigue sin
mostrarlos, así que seguramente algún join esta haciendo restricciones,
y de nuevo apunto al tema del mer de la bd, así que yo en tus zapatos
haría un buen análisis de la bd, y mejoraría su estructura

suerte y paciencia
saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com
  #5 (permalink)  
Antiguo 11/08/2010, 01:21
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 8
Respuesta: consulta rompecabezas

igual tienes razon... en principio use una bd antigua de un proyecto parecido y e intentado adaptarla.. por intentar ahorrar tiempo...

Cuando lo tenga pongo los create table a ver que te parece...

gracias por todo locombiano
  #6 (permalink)  
Antiguo 11/08/2010, 02:23
 
Fecha de Ingreso: mayo-2008
Mensajes: 117
Antigüedad: 16 años
Puntos: 8
Respuesta: consulta rompecabezas

al final creo que se queda así...

Código MySQL:
Ver original
  1. create table titols (
  2.   nom varchar(60) not null,
  3.   descripcio varchar(160) not null,
  4.   primary key(id_titol),
  5.   unique(nom))
  6.  
  7.   create table formulari (
  8.   id_formulari integer auto_increment not null,
  9.   type_input varchar(30) not null,
  10.   variable varchar(30) not null,
  11.   contingut text,
  12.   primary key(id_formulari),
  13.   unique(variable))
  14.  
  15.  
  16.   create table options (
  17.   id_formulari integer not null,
  18.   opt varchar(50) default null,
  19.   primary key(id_option),
  20.   constraint fk_form_opt foreign key (id_formulari) references formulari(id_formulari)
  21.  
  22.   create table carregador(
  23.   id_titol integer not null,
  24.   ordre integer not null,
  25.   id_formulari integer not null,
  26.   primary key(id_titol,id_formulari),
  27.   constraint fk_carregador_formulari foreign key (id_formulari) references formulari(id_formulari)
  28.   constraint fk_carregador_titols foreign key (id_titol) references titols(id_titol)
  29.  
  30.   create table preus(
  31.   id_titol integer not null,
  32.   id_option integer null,
  33.   primary key(id_titol,id_option),
  34.   preu FLOAT (4,2) not null,
  35.   constraint fk_preus_options foreign key (id_option) references options(id_option)
  36.   constraint fk_preus_titols foreign key (id_titol) references titols(id_titol)

la idea es que por cada titulo (podríamos considerarlo como apartados independientes), puedo tener diferentes precios por cada option, por ejemplo 2 titulos que tengan en la tabla cargador formulari.variable==portada_plastificada, pueden o no tener el mismo valor en option ... como tengo al tabla tendre que repetir registros en la tabla preus(precios) con el mismo precio,mismo id_option, pero diferente id_titol...

como esta ahora, tendré que poner todos los registros de formulari en la tabla options obligatoriamente, y los registros que no requieran el campo de opt, tendran options.opt=null.(notese que e puesto default null)

Que tal este planteamiento?
  #7 (permalink)  
Antiguo 11/08/2010, 17:40
Avatar de mortiprogramador
Colaborador
 
Fecha de Ingreso: septiembre-2009
Ubicación: mortuoria
Mensajes: 3.805
Antigüedad: 14 años, 8 meses
Puntos: 214
Respuesta: consulta rompecabezas

hola
bueno, pues si mejora el asunto, podrías también
manejar una tabla intermedia entre formulari y options
que sea la que relacione que formulari tiene que options,
y solo estarían los ids de cada lado, esto obviamente
constituye incluir a esta muchacha en la consulta, pero
pues podría ser otro modo de hacerlo, sin embargo lo que
mencionas de dejarlo en null también es aceptable

saludos
__________________
"Si consigues ser algo más que un hombre, si te entregas a un ideal, si nadie puede detenerte, te conviertes en algo muy diferente."
Visita piggypon.com

Etiquetas: rompecabezas
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 04:27.