Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: mark182 en 17 Noviembre 2009, 18:19 pm



Título: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 18:19 pm
Buenas...como están?

Tengo dos tablas:

| alumnos |            | usuarios|
-------------            -------------
| id_alum | ------> |    id_us   |
| nombre |            |   usuario  |
| colegio  |            | password |
------------            ----------------

Ahora bien....el id_alum y id_us son siempre los mismos numeros. Hagan de cuenta que ya la persona ingreso us y pass, lo que quiero hacer es...sabiendo el us ingresado quiero saber que colegio le pertenece a ese usuario. Me explico?

Como lo puedo hacer?

Muchas gracias.


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 18:21 pm


| alumnos |            | usuarios|
-------------            -------------
| id_alum | ------> |    id_us   |
| nombre |            |   usuario  |
| colegio  |            | password |
------------            ----------------


perdon la relacion va haci:


| alumnos |            | usuarios|
-------------            -------------
| id_alum | <------ |    id_us    |
| nombre |            |   usuario  |
| colegio  |            | password |
------------            ----------------


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 18:30 pm
Puedes hacerlo asi, los datos que yo tomo son de mi punto de vista, puedes acomodarlo a tus necesidades

Código
  1. SELECT colegio,nombre,usuario;
  2. FROM alumnos ;
  3. INNER JOIN usuarios  ON id_alum = id_us;
  4. WHERE password = "la password que dices" AND id_us="el que especifiques"

así tendrás, colegio, nombre y usuario si el id_alum coincide con id_us y si la password es la correcta respecto al id_us que tambien especifiques , nose si me di a entender ñ_ñ

salu2


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 19:01 pm
mmm...no me esta mostrando nada. yo lo puse haci porque nada mas necesito colegio.


Código:
$seleccion = mysql_query("SELECT colegio FROM alumnos INNER JOIN usuarios ON id_alum = id_us WHERE usuario= $_SESSION[usuario]");

echo $seleccion;


No me esta mostrando nada el echo. Que es lo que ocurre?


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 19:16 pm
tal cual lo tienes a mi me funciona

http://i47.tinypic.com/10qccwp.jpg


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 19:34 pm
Nose que pasa...no me muestra nada. Que puede ser? la variabale SESSION esta bien?


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 19:40 pm
INNER JOIN es posible que omita el dato, porque deben ser iguales, si uno es "01" y el otro es " 01" no son iguales, entonces lo omite, porque simplemente no lo encuentra,lo que me preguntas lo ignoro xD , eso ya no es sql  :-X y nose si es variable de sistema o algo asi xD,esperemos q alguien mas te ayude mejor q yo  :-[


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 19:46 pm
INNER JOIN es posible que omita el dato, porque deben ser iguales, si uno es "01" y el otro es " 01" no soy iguales, entonces lo omite

Si, los dos son 01...decis que lo esta omitiendo por tener el mismo valor? entonces que es lo que debo hacer?


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 20:02 pm
no, Inner Joint devuelve los datos SI ambos SON iguales, creo que antes me había expresado mal xD perdon.

descarta que sea la SESSION , has la consulta para mostrarlos todos


Código
  1. SELECT colegio FROM alumnos INNER JOIN usuarios ON id_alum = id_us
  2.  

aca como no filtramos nada, deberias ver todos los colegios, sino ves nada entonces algo pasa con los campos id_alum y id_us


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 20:08 pm
Sip parece que algo pasa con los ids porque sigue sin mostrarme nada  :-\


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 20:10 pm
entonces usa esta consulta para verlos

Código
  1. SELECT id_alum,id_us FROM alumnos,usuarios

aca veremos si soy iguales o no


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 20:21 pm
Me crees si te digo que no me esta mostrando nada  ;D


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 20:23 pm
jajajaja, las tablas estan vacias ¬¬  :xD


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 20:30 pm
no, lo revise y hay un solo registro y estan todos los campos completos.-


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: -Ramc- en 17 Noviembre 2009, 20:33 pm
no, lo revise y hay un solo registro y estan todos los campos completos.-
:O Esto es raro, dame un screen y te creo. :xD

Haz un select a las tablas por separado y dejanos ver que tienen.


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: sempus en 17 Noviembre 2009, 20:37 pm
-Ramc- que incrédulo eres xD, yo si le creo, el error ha de estar en el código que usa para ejecutar la consulta, ya que según el código que el coloco no lo esta haciendo en la linea de comandos de MySQL y por lo tanto le creo que tenga almenos un registro :P

aunque quien sabe  :rolleyes:


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 17 Noviembre 2009, 20:42 pm
Si no selecciono la base de datos no va a mostrar nada no? jajajaj  sin querer borre la parte de mysql_select_db ;D. Me van a matar.

Pero bien...que creen? siguen los problemas, todas las consultas que haga me aparece "Resource id #4" nada mas. Ahora que esta pasando?

Gracias y disculpas.


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: -Ramc- en 17 Noviembre 2009, 21:38 pm
Si no selecciono la base de datos no va a mostrar nada no? jajajaj  sin querer borre la parte de mysql_select_db ;D. Me van a matar.

Pero bien...que creen? siguen los problemas, todas las consultas que haga me aparece "Resource id #4" nada mas. Ahora que esta pasando?

Gracias y disculpas.
La función te devuelve un recurso que ahora utilizaras para sacar las columnas con funciones como: array mysql_fetch_row(resource $result )
Busca sobre esta y sobre mysql_num_rows(resource $result).

Aunque esto ya es de PHP. :P

Saludos.


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: ^Tifa^ en 18 Noviembre 2009, 02:03 am
No se que registro tengas dentro de tu tabla, serias tan amable de postear que consultas estas utilizando? que registros tienes dentro de la tabla (Aunque sean 5 de ejemplo)... y bueno que codigo PHP (Aunque ya esa parte no corresponderia para este subforo, sino a PHP) obvia el codigo (Aunque por la respuesta que expones que siempre te retorna Resourse#4 y aunque no he visto tu tabla segun los campos que tienes este dato como que no concuerda... pareciera que es un fallo mas de codigo que de consulta) Pero sino es mucho pedir, podrias entras por el cliente MySQL (En una terminal o MS-DOS) y realizar la misma consulta SQL (que haces en tu codigo PHP) dentro del mismo motor MySQL y ver que te retorna y exponerlo aca?

Una recomendacion :) (para todos) Procura usar mas indices puesto que:

Cita de: sql

mysql> select * from usuarios;
+-------+---------+----------------------------------+
| id_us | usuario | contraseña                       |
+-------+---------+----------------------------------+
|     1 | coco    | 202cb962ac59075b964b07152d234b70 |
|     2 | shersy  | 202cb962ac59075b964b07152d234b70 |
|     3 | xoxo    | 202cb962ac59075b964b07152d234b70 |
+-------+---------+----------------------------------+
3 rows in set (0.00 sec)                               

mysql> select * from alumnos;
+---------+---------+---------+
| id_alum | nombres | colegio |
+---------+---------+---------+
|       1 | Juan    | Perez   |
|       2 | Maria   | Mendez  |
|       3 | Matias  | Lopez   |
+---------+---------+---------+
3 rows in set (0.00 sec)       


Lo anterior es un ejemplo, llaves primarias solo son id_alum y id_us por el momento, pero si solo quieres el campo 'colegio' y filtras por las 2 llaves de cada tabla mira que pasa:

Código
  1.  
  2. mysql> EXPLAIN SELECT colegio AS COLEGIO FROM alumnos INNER JOIN usuarios WHERE alumnos.id_alum = usuarios.id_us;
  3. +----+-------------+----------+--------+---------------+---------+---------+--------------------------+------+-------------+
  4. | id | select_type | TABLE    | TYPE   | possible_keys | KEY     | key_len | REF                      | ROWS | Extra       |
  5. +----+-------------+----------+--------+---------------+---------+---------+--------------------------+------+-------------+
  6. |  1 | SIMPLE      | alumnos  | ALL    | PRIMARY       | NULL    | NULL    | NULL                     |    3 |             |
  7. |  1 | SIMPLE      | usuarios | eq_ref | PRIMARY       | PRIMARY | 1       | primaria.alumnos.id_alum |    1 | USING INDEX |
  8. +----+-------------+----------+--------+---------------+---------+---------+--------------------------+------+-------------+
  9.  
  10.  
  11.  

Lo anterior muestra como la tabla alumnos para encontrar el campo 'Colegio' del usuario 'coco' tiene que rebuscar en todos los registros que contiene la tabla (Por eso no basta con hacer id = id esto buscara en todos los registros).

Sin embargo si haces:

Código
  1.  
  2. mysql> CREATE INDEX indice ON usuarios(usuario);
  3. Query OK, 3 ROWS affected (0.03 sec)
  4. Records: 3  Duplicates: 0  Warnings: 0
  5.  
  6. mysql> EXPLAIN SELECT colegio AS COLEGIO FROM alumnos,usuarios WHERE usuario = 'coco' AND alumnos.id_alum = ( SELECT id_us FROM usuarios WHERE usuario = 'coco');
  7. +----+-------------+----------+-------+---------------+---------+---------+-------+------+--------------------------+
  8. | id | select_type | TABLE    | TYPE  | possible_keys | KEY     | key_len | REF   | ROWS | Extra                    |
  9. +----+-------------+----------+-------+---------------+---------+---------+-------+------+--------------------------+
  10. |  1 | PRIMARY     | alumnos  | const | PRIMARY       | PRIMARY | 1       | const |    1 |                          |
  11. |  1 | PRIMARY     | usuarios | REF   | indice        | indice  | 21      | const |    1 | USING WHERE; USING INDEX |
  12. |  2 | SUBQUERY    | usuarios | REF   | indice        | indice  | 21      |       |    1 | USING WHERE              |
  13. +----+-------------+----------+-------+---------------+---------+---------+-------+------+--------------------------+
  14. 3 ROWS IN SET (0.00 sec)
  15.  
  16. mysql> EXPLAIN SELECT colegio AS COLEGIO FROM alumnos,usuarios WHERE usuario = 'coco' AND usuarios.id_us = alumnos.id_alum;                      +----+-------------+----------+--------+----------------+---------+---------+-------------------------+------+-------------+
  17. | id | select_type | TABLE    | TYPE   | possible_keys  | KEY     | key_len | REF                     | ROWS | Extra       |
  18. +----+-------------+----------+--------+----------------+---------+---------+-------------------------+------+-------------+
  19. |  1 | SIMPLE      | usuarios | REF    | PRIMARY,indice | indice  | 21      | const                   |    1 | USING WHERE |
  20. |  1 | SIMPLE      | alumnos  | eq_ref | PRIMARY        | PRIMARY | 1       | primaria.usuarios.id_us |    1 |             |
  21. +----+-------------+----------+--------+----------------+---------+---------+-------------------------+------+-------------+
  22. 2 ROWS IN SET (0.00 sec)
  23.  
  24.  
  25.  

En ambos casos de consultas donde hay hasta un subquery, ves como la consulta solo analiza 1 columna en vez de todas para retornarte el resultado???  ;)  ten pendiente que campos pueden ser candidatos a llave o indices en tu tabla para que le saques provecho de optimizacion a una consulta.



Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 18 Noviembre 2009, 09:14 am
Gracias a todos por su ayuda antes que nada. Ya lo que me dice ^TiFa^ es muy avanzado para mi y no lo entiendo. Y segui buscando y buscando pero no puedo hacer lo que quiero.  :-\


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: ^Tifa^ en 18 Noviembre 2009, 13:29 pm
Disculpa mark182, hice un punto de referencia sobre optimizacion de una consulta en una DB. (Hare una mini introduccion mas extendida de ventajas y desventajas de optimizacion en una base de datos de MySQL para pegarle una chinchetita y asi puedan conocer de mejor forma esta funcionalidad tan olvidada entre programadores webs  ;) asi el tema no sera tan avanzado como lo vez por el momento.)

Ok, me temo que no podemos ayudarte mas extendido sino sabemos que informacion tienen las tablas de tu base de datos, ni que consulta tu estas haciendo para obtener esos datos. Mi pregunta era, que consulta SQL es que estas realizando para obtener los datos que pides???  si tus tablas realmente tienen registros cualquiera de las consultas anteriormente posteadas aqui deben retornarte un valor (Al menos dentro del motor, esto es individual de lo que tengas en PHP)

Segun las tablas que colocaste de ejemplo, hice una imitacion de las tuyas con 3 filas cada una (Como podras ver en el ejemplo):

Código
  1.  
  2. mysql> SELECT * FROM usuarios;
  3. +-------+---------+----------------------------------+
  4. | id_us | usuario | contraseña                       |
  5. +-------+---------+----------------------------------+
  6. |     1 | coco    | 202cb962ac59075b964b07152d234b70 |
  7. |     2 | shersy  | 202cb962ac59075b964b07152d234b70 |
  8. |     3 | xoxo    | 202cb962ac59075b964b07152d234b70 |
  9. +-------+---------+----------------------------------+
  10. 3 ROWS IN SET (0.00 sec)                              
  11.  
  12. mysql> SELECT * FROM alumnos;
  13. +---------+---------+---------+
  14. | id_alum | nombres | colegio |
  15. +---------+---------+---------+
  16. |       1 | Juan    | Perez   |
  17. |       2 | Maria   | Mendez  |
  18. |       3 | Matias  | Lopez   |
  19. +---------+---------+---------+
  20. 3 ROWS IN SET (0.00 sec)      
  21.  
  22.  
  23.  

De igual manera viste como obtuve el campo colegio solamente con el nombre de usuario (Como lo andas solicitando):

Código
  1.  
  2. mysql> SELECT *  FROM alumnos INNER JOIN usuarios WHERE usuario = 'coco' AND usuarios.id_us = alumnos.id_alum;  
  3.  
  4. +---------+---------+---------+
  5. | id_alum | nombres | colegio |
  6. +---------+---------+---------+
  7. |       1 | Juan    | Perez   |
  8.  
  9.  

si te fijas en la tabla usuarios al usuario 'coco' le corresponde el id_us = 1 por ende retornamos la info de la tabla alumnos correspondiente a id_alum = 1, en tu caso deberia ser un SELECT colegio en vez de SELECT * (ALL) y funciona perfectamente dentro del motor (Puedes probarlo conectandote individualmente a MySQL por MS-DOS si estas en Windows o una Terminal si estas en Linux y realizando la mismita consulta que se te ha publicado aca) Si obtienes los datos que buscas dentro del motor, pero no lo obtienes a traves de web... me temo que el problema estaria dentro de la programacion de tu codigo PHP y no de la manera de realizar tu consulta SQL en si.


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: mark182 en 18 Noviembre 2009, 21:10 pm
Hice la consulta que me plantearon y me dio la respuesta que buscaba. Haci que ire a molestar al foro de PHP aver si encuentran el problema.

Muchisimas gracias ^TiFa^ y sempus. Valió su ayuda. Que tengan buen día.


Título: Re: Ayuda con una consulta con tablas relacionadas mysql
Publicado por: ^Tifa^ en 19 Noviembre 2009, 03:15 am
De nada mark182  ;)

Suerte con eso.