Comunidad de diseño web y desarrollo en internet online

Duda de como hacer un query...

Citar            
MensajeEscrito el 18 Ago 2010 06:43 am
Buenos días a todos. :o

Tengo un problemon de planteamiento o de desconocimiento a la hora de hacer un query. Me explico:

En primer lo planteo el fundamento... Digamos que un usuario para conseguir un certificado, necesita tener todas las unidades formativas del mismo. Es decir un certificado tiene varias unidades formativas y son específicas de él.

El usuario cuando hace su registro, al poner la titulación académica que tiene y los cursos que lleva hechos, se le asignan automáticamente las unidades formativas que el tiene. Pues bien, lo que necesito es, de alguna manera, repasando las unidades formativas que tiene el usuario, ver si completa algún certificado en todas sus unidades formativas.

Pongo las tablas:

UNIDADES_USER
----------------------------
ID | NICK | UNIDAD_FORMATIVA
01 |Pepe |unidad1
02 |Pepe |unidad2
03 |Pepe |unidad3
04 |Pepe |unidad4


CERTIFICADOS
----------------------------
ID | CERTIFICADO | UNIDAD_FORMATIVAS
01 | certificado1 | unidad1
02 | certificado1 | unidad2
03 | certificado2 | unidad9
04 | certificado2 | unidad13


Según estas tablas Pepe, al tener las unidad1 y la unidad2 tiene completo el certificado1. ¿Cómo hacer esa busqueda?
También me haría falta saber aquellos certificados en los cuales Pepe al menos tuviese una unidad del mismo.

Doy las gracias de antemano.

Por zambranosoft

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Ago 2010 07:57 am
Espero que estes trabajando con MySQL, aqui te doy algo para que comiences

Código MySQL :

SELECT
u.NICK,
c.CERTIFICADO,
COUNT(u.UNIDAD_FORMATIVA) as unidades_aprob,
c_u.total_unidades,
total_unidades = COUNT(u.UNIDAD_FORMATIVA) AS completo,
(total_unidades - COUNT(u.UNIDAD_FORMATIVA)) AS por_aprobar
FROM unidades_user as u
LEFT JOIN certificados c ON c.UNIDAD_FORMATIVAS = u.UNIDAD_FORMATIVA
LEFT JOIN (SELECT CERTIFICADO, COUNT(*) as total_unidades FROM certificados GROUP BY CERTIFICADO) as c_u ON c_u.CERTIFICADO = c.CERTIFICADO
WHERE u.NICK = 'Pepe'
GROUP BY c.CERTIFICADO;


Si es postgresql sufriras para hacer una consulta similar

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 18 Ago 2010 08:44 am
Muchas gracias Maikel. Ahí me estoy peleando sobre lo que me has dado. Me da algún que otro petardazo y lo estoy intentando depurar sobre lo que me has dado con la nomenclatura exacta de las tablas.

SELECT `uni_form_user.NICK_USER`, `unidades.CERTIFICADO`, COUNT(`uni_form_user.UNIDAD_FORMATIVA`) as
UNIDADES_APROB, C_U.total_unidades,
total_unidades = COUNT(`uni_form_user.UNIDAD_FORMATIVA`) AS completo,
(total_unidades - COUNT(`uni_form_user.UNIDAD_FORMATIVA`)) AS por_aprobar
FROM uni_form_user AS U
LEFT JOIN unidades c ON `unidades.UNIDAD` = `uni_form_user.UNIDAD_FORMATIVA`
LEFT JOIN (SELECT CERTIFICADO, COUNT(*) as total_unidades FROM unidades GROUP BY CERTIFICADO) as
C_U ON C_U.CERTIFICADO = `unidades.CERTIFICADO`
WHERE `uni_form_user.NICK_USER` = `b`
GROUP BY `unidades.CERTIFICADO`


:S De momento no va, me da falla a la hora de reconocer los campos como `uni_form_user.NICK_USER`, así que a ello.


Gracias de nuevo, a ver si soy capaz de solucionarlo.

Por zambranosoft

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 18 Ago 2010 07:43 pm
Pendiente de los alias, veo que no lo estas usando bien.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 01 Sep 2010 09:34 am
Buenas Maikel, he estado de vacaciones... Voy a revisar de nuevo la consulta, pero la verdad que estoy perdido con la operación. Es la primera vez que gestiono una aplicación con MySQL y la verdad que me está costando, pero bueno poco a poco.

Si sabes en que alias la estoy liando o donde puedo cometer algún fallo en el post anterior; porfi comunícamelo.

Sin más, gracias por todo y saludos desde España.

Por zambranosoft

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 01 Sep 2010 11:54 pm

Código MySQL :

FROM uni_form_user AS U
LEFT JOIN unidades c ON `unidades.UNIDAD` = `uni_form_user.UNIDAD_FORMATIVA`


Alli defines dos alias y no los usas. En esa parte seria asi

Código MySQL :

FROM uni_form_user AS U
LEFT JOIN unidades c ON c.UNIDAD = u.UNIDAD_FORMATIVA


Igual debes reemplazarlo en todo el sql. En fin, si defines algo úsalo sino no tiene sentido.

saludos

Por Maikel

BOFH

5575 de clabLevel

22 tutoriales
5 articulos

Genero:Masculino   Team Cristalab

Claber de baja indefinida

firefox
Citar            
MensajeEscrito el 02 Sep 2010 12:04 pm
Muchas gracias Maikel, eres un crá.

De momento ese código lo tengo ya perfeccionado, y además me estuve implementando lo siguiente:

CON ESTE MUESTRO LOS CERTIFICADOS EN LOS CUALES EL USUARIO AL MENOS TIENE UNA UNIDAD_FORMATIVA

SELECT DISTINCT uni_form_user.NICK_USER, uni_form_user.UNIDAD_FORMATIVA, unidades.CERTIFICADO
FROM unidades, uni_form_user
WHERE unidades.UNIDAD = uni_form_user.UNIDAD_FORMATIVA
AND NICK_USER = 't'

CON ESTE SE EL NÚMERO DE UNIDADES QUE TIENEN LOS CERTIFICADO

SELECT CERTIFICADO, COUNT( * )
FROM unidades
GROUP BY CERTIFICADO


Sólo me quedaría ser capaz de combinar estos dos para que me muestre aquel o aquellos certificados en el cual el número de unidades del segundo Select sea el mismo que el número de unidades de un certificado que saco en el primer Select...

Por ahí ando, a ver, a ver.


Con el que me indicaste anteriormente, también sigo liado, me da valor NULL en principio. Me queda comprobar donde falla.


Muchícimas gracias Maikel.

Por zambranosoft

2 de clabLevel



 

firefox
Citar            
MensajeEscrito el 03 Sep 2010 05:10 pm
zambranosoft El tamaño máximo de los avatares es de 100x100. El tuyo es exageradamente grande y rompe el diseño del foro, por los dioses del código y las mejores prácticas, redúcelo por favor.

Por The Fricky!

Presidente

6168 de clabLevel

3 tutoriales
8 articulos

Genero:Masculino   Bastard Operators From Hell Héroes

Piccola Venezia...

chrome

 

Cristalab BabyBlue v4 + V4 © 2011 Cristalab
Powered by ClabEngines v4, HTML5, love and ponies.