Dudas de consulta SQL

Iniciado por Skeletron, 6 Diciembre 2009, 21:38 PM

0 Miembros y 1 Visitante están viendo este tema.

Skeletron

Hola gente..
Les comento lo siguiente:
Tengo una base de datos con 2 tablas:
Locales y Tipos

Locales tiene las siguientes columnas:
Nombre - Tipo - Direccion

Tipos tiene las sigueintes columnas:
ID - Tipo

Ok...
Locales.Tipo es un INTEGER. ese INTEGER, es igual al TIPO.ID del TIPO.Tipo que lleva el nombre del "TIPO" que es el local..
o sea..

Supongan que existe un local de comida rapida, entonces la entrada en LOCALES ES:
BurguerKing - 1 - Shoping

Y en la tabla TIPOS dice:
1 - Comidas Rapidas

Bien.. creo que me han entendido.. o no??

Ahora en PHP, quiero mostrar lo locales que tienen como direccion: "Pepe", y hacer un "echo" del siguiente tipo:
"El local de nombre: BurguerKing , es del tipo: Comidas Rapidas, y está en: Shoping"

Se entendió?
Como carajo sería ese SELECT?!?!?!?!?
         $res = mysql_query("SELECT * FROM locales l, tipos t WHERE l.calle='xxxx'");
         while($row = mysql_fetch_array($res)){
            echo "El local de nombre: " . $row[] . ", es del tipo: " . $row[] . "y esta en: " . $row[] . "<br>";
         }
Eso utilizo para mostrar los datos....

Me tiran una ayuda? :D

^Tifa^

Supongo que preguntaras como hacer en el motor de base de datos lo que haces en php, puesto que en tu ejemplo mostrado con echo y usando los indices de cada variable debe funcionar perfectamente.

Ahora si preguntas como hacer lo mismo pero en el motor de DB. Tienes  2 opciones, o un procedimiento almacenado (mas comodo) o manualmente declarando variables temporales y usandolas dentro de tu consulta. Por ejemplo:

Imagina que tengo estas dos tablas:

Código (sql) [Seleccionar]

mysql> select * from tipo;
+----+--------------------+
| id | tipo               |
+----+--------------------+
|  1 | Comida Rapida      |
|  2 | Comida semi-rapida |
|  3 | Comida instantanea |
+----+--------------------+
3 rows in set (0.00 sec)

mysql> select * from locales;
+------------+------+-----------------+
| nombre     | tipo | direccion       |
+------------+------+-----------------+
| BurgerKing |    1 | Calle nadie #45 |
| MacDonalds |    2 | Calle nadie #33 |
| KFC        |    3 | Calle nadie #24 |
+------------+------+-----------------+
3 rows in set (0.00 sec)



Con un procedimiento almacenado (Esto es un ejemplo en MySQL);

Código (sql) [Seleccionar]

mysql> delimiter /
mysql> create procedure proceso(in numero integer)
    -> begin                                     
    -> set @nombre := 'El local de nombre : ';
    -> set @tipo := ' Es del tipo : ';
    -> set @direccion := ' Ubicado en : ';
    -> select concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) from locales inner join tipo where locales.tipo = numero and tipo.id = locales.tipo;                                                           
    -> end;
    -> /
Query OK, 0 rows affected (0.00 sec)

mysql> delimiter ;
mysql> call proceso(1);
+--------------------------------------------------------------------------------+
| concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
+--------------------------------------------------------------------------------+
| El local de nombre : BurgerKing Ubicado en : Calle nadie #45 Es del tipo : 1   |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> call proceso(2);
+--------------------------------------------------------------------------------+
| concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
+--------------------------------------------------------------------------------+
| El local de nombre : MacDonalds Ubicado en : Calle nadie #33 Es del tipo : 2   |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)



Con variables temporales en una consulta SQL (Validas solo por sección de usuario):

Código (sql) [Seleccionar]


mysql> set @nombre := 'El local de nombre : '; set @tipo := ' Es del tipo : '; set @direccion := ' Ubicado en : ';
Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

mysql> select concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) from locales inner join tipo where locales.tipo = 1 and tipo.id = locales.tipo;
+--------------------------------------------------------------------------------+
| concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
+--------------------------------------------------------------------------------+
| El local de nombre : BurgerKing Ubicado en : Calle nadie #45 Es del tipo : 1   |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> select concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) from locales inner join tipo where locales.tipo = 2 and tipo.id = locales.tipo;
+--------------------------------------------------------------------------------+
| concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
+--------------------------------------------------------------------------------+
| El local de nombre : MacDonalds Ubicado en : Calle nadie #33 Es del tipo : 2   |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

Skeletron

No.. yo en PHP no estoy haciendo nada.. Es mas..
Mira esta linea:
echo "El local de nombre: " . $row[] . ", es del tipo: " . $row[] . "y esta en: " . $row[] . "<br>";
Crees que esa linea sería capaz de imprimir algo por pantalla?

NO HICE ABSOLUTAMENTE NADA...

No creo que sea necesario armar semejante complejidad...
Mira.. como voy a mostrar el dato:
"Es un local de COMIDA RAPIDA", si lo que dice en la tabla es: "1"
O sea.. como REEMPLAZO el valor 1, por el valor de TEXTO que le corresponde que esta en la otra tabla... todo eso, en 1 sola consulta..

Porque podria hacer una consulta para traer los locales de direccion: Xxxxxx y luego hago otra consulta para ver como es el "tipo de local" que tiene el ID igual al numero de tipo de local de la tabla LOCALES...

Tendria que traer primero los locales, y luego los tipos.. o sea.. 2 consultas... y no quiero hacer eso..
Como puedo hacer todo en 1 sola consulta? en 1 solo mysql_query

^Tifa^

Yo pensaba que esta linea:

Citarecho "El local de nombre: " . $row[] . ", es del tipo: " . $row[] . "y esta en: " . $row[] . "<br>";

A proposito le habias quitado los indices (por ejemplo $row[1], $row[2], etc) de las variables cuando posteaste tu duda aca por rapidez o porque era un ejemplo o algo asi   :-\  pero veo que no...... veo que realmente tu codigo es asi  :-\  por eso supuse que querias saber como imprimir dentro del motor los registros concatenados con las frases... disculpame si malinterprete mal.

Sobre tu codigo PHP creo que lo que andas buscando es

mysql_fetch_assoc

Donde $row["campo"] es el nombre real del campo dentro de la tabla en cuestion.

Código (php) [Seleccionar]


while ($row = mysql_fetch_assoc($res)) {
    echo "El local de nombre: "  .  $row["nombre"] . es del tipo: " . $row["tipo"] . "y esta en: " . $row["direccion"] . "<br>";

Skeletron

#4
Y el mysql_query?
Basicamente, yo no se como hacer ésta consulta.


"SELECT todo de LOCALES y todo de TIPOS FROM TIPOS y LOCALES WHERE calle sea igual a: xxxxx"
Mostrar Datos de los locales que devolvió la consulta, pero con su "tipo de local" correspondiente..


Si me entendes, bien, sino, decime y te hago una super explicacion de unas 95 paginas de los 2 lados, así me entendes :)

Novlucker

Código (sql) [Seleccionar]
SELECT locales.*,tipos.tipo
FROM locales inner join tipos
ON locales.tipo=tipos.tipo
WHERE direccion='Pepe'


Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Skeletron

Cita de: Novlucker en  7 Diciembre 2009, 03:52 AM
Código (sql) [Seleccionar]
SELECT locales.*,tipos.tipo
FROM locales inner join tipos
ON locales.tipo=tipos.tipo
WHERE direccion='Pepe'


Saludos

Seguramente debe ser eso lo que pido.. Pero acordate que en la tabla "TIPOS" tengo un ID y un TIPO... en ID tengo el numero, que identifica al tipo, y en la tabla LOCALES, en TIPO, tengo al NUMERO que es igual al ID de la tabla TIPOS..

Será así?:
Código (sql) [Seleccionar]
SELECT locales.*,tipos.*
FROM locales INNER JOIN tipos
ON locales.tipo=tipos.id
WHERE direccion='Pepe'

Novlucker

Ups :-X, si, en realidad sería así como dices, el = es contra tipos.ID :P

Por otra parte, en la primera línea puse tipos.tipo porque sino te va a salir dos veces el ID, una por la primera tabla (tipo) y una por la segunda (ID)

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

Skeletron

FUNCIONA!!!

Hice ésto:

$res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia'");
         while($row = mysql_fetch_array($res)){
            echo "Tipo: " . $row['calle'] . ", Nombre: " . $row['nombre'] . "<br>";
         }


Ahora bien.. si quiero mostrar el ID.. sabiendo que tengo un ID en Locales, y otro ID en Tipos, como hago para hacerle un "ECHO" a ese ID???

$row['t.id'] <<< no funciona

l337*

como tienes dos 'id' lo mas conveniente seria imprimir los array keys y de ahi agarrar el q ocupas para el id que quieres.

Código (php) [Seleccionar]


$res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia'");
         while($row = mysql_fetch_array($res)){
           print_r($row) ;
           echo "<br/>--<br/>" ;

      }


tambien puedes sustituir el nombre por el indice, ej:
$row['id'] / $row['nombre'] / $row['bla']  ===  $row[0] / $row[1] / $row[2]