Foro de elhacker.net

Programación => Bases de Datos => Mensaje iniciado por: Skeletron en 6 Diciembre 2009, 21:38 pm



Título: Dudas de consulta SQL
Publicado por: Skeletron en 6 Diciembre 2009, 21:38 pm
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


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 6 Diciembre 2009, 22:41 pm
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
  1. mysql> SELECT * FROM tipo;
  2. +----+--------------------+
  3. | id | tipo               |
  4. +----+--------------------+
  5. |  1 | Comida Rapida      |
  6. |  2 | Comida semi-rapida |
  7. |  3 | Comida instantanea |
  8. +----+--------------------+
  9. 3 ROWS IN SET (0.00 sec)
  10.  
  11. mysql> SELECT * FROM locales;
  12. +------------+------+-----------------+
  13. | nombre     | tipo | direccion       |
  14. +------------+------+-----------------+
  15. | BurgerKing |    1 | Calle nadie #45 |
  16. | MacDonalds |    2 | Calle nadie #33 |
  17. | KFC        |    3 | Calle nadie #24 |
  18. +------------+------+-----------------+
  19. 3 ROWS IN SET (0.00 sec)
  20.  
  21.  

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

Código
  1. mysql> delimiter /
  2. mysql> CREATE PROCEDURE proceso(IN numero INTEGER)
  3.    -> BEGIN                                      
  4.    -> SET @nombre := 'El local de nombre : ';
  5.    -> SET @tipo := ' Es del tipo : ';
  6.    -> SET @direccion := ' Ubicado en : ';
  7.    -> 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;                                                          
  8.    -> END;
  9.    -> /
  10. Query OK, 0 ROWS affected (0.00 sec)
  11.  
  12. mysql> delimiter ;
  13. mysql> CALL proceso(1);
  14. +--------------------------------------------------------------------------------+
  15. | concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
  16. +--------------------------------------------------------------------------------+
  17. | El LOCAL de nombre : BurgerKing Ubicado en : Calle nadie #45 Es del tipo : 1   |
  18. +--------------------------------------------------------------------------------+
  19. 1 ROW IN SET (0.00 sec)
  20.  
  21. Query OK, 0 ROWS affected (0.00 sec)
  22.  
  23. mysql> CALL proceso(2);
  24. +--------------------------------------------------------------------------------+
  25. | concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
  26. +--------------------------------------------------------------------------------+
  27. | El LOCAL de nombre : MacDonalds Ubicado en : Calle nadie #33 Es del tipo : 2   |
  28. +--------------------------------------------------------------------------------+
  29. 1 ROW IN SET (0.00 sec)
  30.  
  31. Query OK, 0 ROWS affected (0.00 sec)
  32.  
  33.  

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

Código
  1.  
  2. mysql> SET @nombre := 'El local de nombre : '; SET @tipo := ' Es del tipo : '; SET @direccion := ' Ubicado en : ';
  3. Query OK, 0 ROWS affected (0.00 sec)
  4.  
  5. Query OK, 0 ROWS affected (0.00 sec)
  6.  
  7. Query OK, 0 ROWS affected (0.00 sec)
  8.  
  9. 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;
  10. +--------------------------------------------------------------------------------+
  11. | concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
  12. +--------------------------------------------------------------------------------+
  13. | El LOCAL de nombre : BurgerKing Ubicado en : Calle nadie #45 Es del tipo : 1   |
  14. +--------------------------------------------------------------------------------+
  15. 1 ROW IN SET (0.00 sec)
  16.  
  17. 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;
  18. +--------------------------------------------------------------------------------+
  19. | concat(@nombre, locales.nombre, @direccion, locales.direccion, @tipo, tipo.id) |
  20. +--------------------------------------------------------------------------------+
  21. | El LOCAL de nombre : MacDonalds Ubicado en : Calle nadie #33 Es del tipo : 2   |
  22. +--------------------------------------------------------------------------------+
  23. 1 ROW IN SET (0.00 sec)
  24.  


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 00:22 am
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


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 01:21 am
Yo pensaba que esta linea:

Citar
echo "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
  1.  
  2. while ($row = mysql_fetch_assoc($res)) {
  3.    echo "El local de nombre: "  .  $row["nombre"] . es del tipo: " . $row["tipo"] . "y esta en: " . $row["direccion"] . "<br>";
  4.  


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 02:57 am
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 :)


Título: Re: Dudas de consulta SQL
Publicado por: Novlucker en 7 Diciembre 2009, 03:52 am
Código
  1. SELECT locales.*,tipos.tipo
  2. FROM locales INNER JOIN tipos
  3. ON locales.tipo=tipos.tipo
  4. WHERE direccion='Pepe'

Saludos


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 03:55 am
Código
  1. SELECT locales.*,tipos.tipo
  2. FROM locales INNER JOIN tipos
  3. ON locales.tipo=tipos.tipo
  4. 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
  1. SELECT locales.*,tipos.*
  2. FROM locales INNER JOIN tipos
  3. ON locales.tipo=tipos.id
  4. WHERE direccion='Pepe'


Título: Re: Dudas de consulta SQL
Publicado por: Novlucker en 7 Diciembre 2009, 03:59 am
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


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 04:01 am
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


Título: Re: Dudas de consulta SQL
Publicado por: l337* en 7 Diciembre 2009, 04:14 am
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
  1.  
  2. $res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia'");
  3.         while($row = mysql_fetch_array($res)){
  4.           print_r($row) ;
  5.           echo "<br/>--<br/>" ;
  6.  
  7.      }
  8.  

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


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 04:30 am
Hasta ahora es que mas o menos vengo a entender tu peticion  :P

Haz intentando con $row["tipo.id"] o $row["locales.tipo"] o sencillamente $row['id'] ya que total tipo en locales y id en tipo tienen el mismo valor.

PD: Tu consulta tiene un problemita de optimizacion chiquito  ;)  es super bueno que te funcione pero.... si haces esto:

Citar
ON l.tipo=t.id

Le estas diciendo al optimizador de mysql, buscame en todas las columnas donde ambos datos correspondan... si tienes 10,000 columnas antes de retornarte el resultado final que solicitas con el WHERE l.calle = "independencia" (Que por cierto calle no es un indice es un campo comun y corriente segun expusiste... esto hara la consulta aun mas lenta que si campo fuese indice). Podrias ya que sabes que haras tu busquedad con la direccion, crear un indice en el campo calle y buscar la manera para que esto

Citar
ON l.tipo=t.id


No busque en todas las columnas existentes... podrias intentar antes de esa ultima validacion con algo mas o menos asi:

Código
  1. WHERE l.tipo = (SELECT tipo FROM TABLE WHERE calle = "independencia" ) AND t.id = l.tipo

recuerdate crearle un INDEX al campo calle para hacer la validacion anterior.  ;)   lo anterior solo funciona si cuando hagas el select tipo where calle = bla retorne 1 solo valor, si retonar mas de 1 valor tendras que hacer algo como:

Código
  1. WHERE l.tipo IN(SELECT tipo FROM tabla WHERE calle = "independencia") AND t.id IN( SELECT tipo FROM tabla WHERE calle = "independencia")

no lo he probado esto te lo digo a puro comentario, pero mas o menos deberia funcionar y asi tu consulta quedaria mas optimizada de lo que no esta actualmente.


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 04:48 am
Lo que provoca el horario nocturno tarde, suenio y pocas horas para dormir....

Obvia todo lo anterior que postee, he probado la consulta en el optimizador de MySQL (Ya que la anterior no la probe)

Te basta con crear un indice sobre el campo calle para que filtre y optimize la consulta como es  ;)  por ende puedes conservar intacta tu consulta, sencillamente crea un indice extra al campo calle para que el rendimiento sea mayor.

Un saludo


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 04:50 am
Llego la hora de especificar:

No voy a hacer 1 solo tipo de búsqueda.. el usuario podra hacer 4 tipos de busqueda:
la tabla en realidad, no tiene una "DIRECCION" sino que tiene 2 campos: CALLE y NUMERO (numero, es el numero de la calle.. como por ejemplo: Independencia 710).
También podra buscar por TIPOS de locales, tambien podra por NOMBRE DE LOCAL, y por ultimo, por servicios ofrecidos (aunque, de ésto no les he hablado.. ya que SI O SI tengo que hacer 2 consultas sql)


Supongamos que estamos haciendo la busqueda por DIRECCION..
El usuario podrá ingresar 3 valores:
Calle, Numero "DESDE" y numero "HASTA".. para buscar todos los locales en la calle Independencia, desde la altura 300 al 1000 (supongamos)

Mi codigo es éste:

Código
  1. $res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia' AND l.numero > '300' and l.numero < '1000'");
  2. echo "Resultados:<br />";
  3. while($row = mysql_fetch_array($res)){
  4. echo "<hr /><br />Nombre del local: " . $row['nombre'] . ", Tipo: " . $row['tipo'] . ", Direccion: " . $row['calle'] . " " . $row['numero'];
  5. }
  6.  
(suponemos que donde puse el dato: INDEPEDNENCIA y 300 y 1000, ahí estarán tomados los valores desde las variables GET del la URL
Y los datos de mi base de datos son:

Citar
   TABLAS:
      mails:                           TABLA DE MAILS
          mail(varchar:35)               Los Mails de los registrantes
       locales:                        TABLA DE LOCALES
          id(int:4) (primaria)            Identificador
            nombre(varchar:50)               Nombre del Local
           tipo(int:2) (indice)            Identificador Tipo de Local
            calle(varchar:100)               Direccion del local
            numero(int:4)                  Direccion del local
           servicios(varchar:50)            Numeros de los Servicios prestados
            telefono(varchar:15)            Telefono del local
           votos (int:4)                  Total de votos recibidos
           total(int:5)                  Suma del total de los votos
            observacion(varchar:120)         Observaciones nuestras
        tipos:                           TABLA DE TIPOS DE LOCALES
           id(int:2) (primaria)            Identificador
            tipo(varchar:30)               Tipo de Locales: Delivery, Bar, etc
        servicios:                        TABLA DE SERVICIOS
           id(int:2) (primaria)            Identificador
            tipo(varchar:30)               Tipo de servicio: Gaseosas, Alcohol, Hospedaje, Delivery, etc
       opiniones:                        TABLA DE OPINIONES
           id(int:4) (indice)               Identificador
            texto(varchar:1000)               Texto de la opinion



La web que es?
La web tendrá todos los datos de todos los tipos de locales que hay en MI BARRIO de MI CIUDAD...
Por lo que la gente que quiera buscar que locales hay en X calle, podra hacerlo buscando por direccion..
Si quieren bsucar donde esta el local: "Don Juan el Pizzero" podran hacerlo bsucando por NOMBRE
Si quieren buscar donde venden Pizzas y Gaseosas, lo harán con otro metodo (el valor SERVICIOS dentro de LOCALES, tendrá separado por comas "," cada tipo de servicio que ofrece.. pero esos valores, no serán los servicios en SI, sino, los numeros de los servicios que tambien estan identificados en la tabla SERVICIOS.. sería LO MISMO que pasa en éste caso..)


Ahora bien.. Sabiendo que hay 4 tipos de COnsultas.. Donde me conviene poner los Index? yo lo puse en TIPO.. porque supongo que lo que mas se va a buscar es el "TIPO" de local.. porque la mayoria (supongo) buscará Deliverys... o tambien puede que busquen por servicios.. eso lo haré con una consulta que mire si dentro de SERVICIOS está el numero "4" (supongamos que 4 es: EMPANADAS, y el usuario buscaba empanadas)...

Bien.. Ahí esta toda la explicacion...

Tifa, vos me decis que haga:

SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.tipo IN(SELECT tipo FROM tabla WHERE calle = "independencia") AND t.id IN( SELECT tipo FROM tabla WHERE calle = "independencia")

La verdad, no logré ententer eso.. que se supone que hará?


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 04:55 am
Y que mejor para que vallan imaginando, que ver la web..

:www.brodasoft.com.ar/NuevaCordoba

Dont by Evil..
Puede tener XSS por el momento, porque esta en desarrollo.. no sean malos :D no prueben maldades :D


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 05:13 am
Citar
Tifa, vos me decis que haga:

SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.tipo IN(SELECT tipo FROM tabla WHERE calle = "independencia") AND t.id IN( SELECT tipo FROM tabla WHERE calle = "independencia")

La verdad, no logré ententer eso.. que se supone que hará?

Optimizacion chico, optimizacion. Recuerda que los registros en tu tabla iran creciendo con el tiempo y si dejas la consulta como la tienes, con el tiempo lo que tardaba en devolverte en a lo mejor 0.03 segundos en un futuro (depende el crecimiento de datos) podra tardar 0.50 segundos la misma consulta .... y si crecen mas datos dentro de la tabla luego no sera 0.50 segundos sino hasta 2 minutos lol.. para retornarte una consulta.

Obvia todo lo que dije anteriormente y ya que haz dado mas detalles de tus tablas:

Código
  1.  
  2. CREATE INDEX INDICE ON locales(calle, numero);
  3.  
  4.  

Y a tu consulta:



"SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia' AND l.numero > '300' and l.numero < '10000'


Yo si fuese tu (por optimizacion) lo modificase a :



SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia' AND l.numero in('3000','100000');



Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 05:55 am
Perfecto!!!
Quedó así:
(http://img198.imageshack.us/img198/2056/indices.jpg)

y el codigo php así:

Código
  1. $res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia' AND l.numero in('3000','100000')");
  2. echo "Resultados:<br />";
  3. while($row = mysql_fetch_array($res)){
  4. echo "<hr /><br />Nombre del local: " . $row['nombre'] . ", Tipo: " . $row['tipo'] . ", Direccion: " . $row['calle'] . " " . $row['numero'];
  5. }

La imagen de la tabla: LOCALES
(http://img13.imageshack.us/img13/4903/tablalocales.jpg)
Y ningun otro INDICE ni nada??


PERO.. HAY PROBLEMAS:. No me devuelve nada..
Ejecuto ese codigo tambien en PHPMyAdmin, y TAMPOCO devuelve algo...
Recuerdo que lo que yo quiero, es devolver todos los locales que tengan un valor de "numero" entre 300 y 1000.. el "IN ('300', '1000')" funcionaría???


Que me dices de los INDICES en OPINIONES, TIPOS y SERVICIOS??? Ellas 3, tienen solo 2 columnas.. y utilizo SIEMPRE, solamente 1 columna.. ID... Le hago indice en las 3?
En las 3 tablas, "ID" es "PRIMARY"... funciona tambien como indice? o hace falta que ID sea PRIMARY y tambien agregarle un INDICE?


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 13:22 pm
Citar
Y ningun otro INDICE ni nada??

Dependera siempre y cuando vayas a hacer tu consulta SQL solicitando realizar una busquedad por una condicion mas, por ejemplo suponte que al where..and..and quieres agregarle otro campo mas:

where numero between(algo,algo) and votos = algo

Entonces el campo votos habria que crearle un indice, de lo contrario puedes dejar todo igual.

Citar
PERO.. HAY PROBLEMAS:. No me devuelve nada..
Ejecuto ese codigo tambien en PHPMyAdmin, y TAMPOCO devuelve algo...
Recuerdo que lo que yo quiero, es devolver todos los locales que tengan un valor de "numero" entre 300 y 1000.. el "IN ('300', '1000')" funcionaría???

Si pero fijate en la consulta que estas guardando (Y que yo te coloque):

SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo=t.id WHERE l.calle='Independencia' AND l.numero in('3000','100000')

l.numero in('3000','100000')  no deberia ser para tu caso l.numero in('300','1000') ??? Porque entre 3000 y 100000 hay mucha diferencia de numeros delante de entre 300 y 1000.



Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 16:00 pm
Estoy usando éste:
$res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo = t.id WHERE l.calle = 'Independencia' AND l.numero IN ('300','1000')");


Y juro que no devuelve nada.. entre 300 y 1000
Y los numerros del ejemplo, estan entre ese rango.. muy extraño...
Mira las imagenes que puse arriba... ahí podras ver los valors exactos de las entradas..

mira:
(http://img704.imageshack.us/img704/8123/vacio.jpg)


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 16:50 pm
Ups.... vas a molestarte mucho conmigo  :-[   :-[   :-[   :-[   :-[   :-[ 

sorry..  :-\

Era un poco tarde cuando te sugeri lo que te sugeri (estaba mas dormida que despierta), y ahora mirando la consulta es que me doy cuenta de mi fallo  :-\

Mira, no te devuelve nada cuando haces esto:

$res = mysql_query("SELECT l.*, t.* FROM locales l INNER JOIN tipos t ON l.tipo = t.id WHERE l.calle = 'Independencia' AND l.numero IN ('300','1000')");

Debido a que l.numero IN('300','1000') se le esta diciendo a la consulta retorname todas las filas donde el campo numero tenga 300 o 1000  :-[  perdona, se que lo que tu buscas es que los datos esten entre 300 y 10000 no que sean exclusivamente 300 y 1000...

Tu consulta estaba bien como estaba anteriormente (cuando utilizabas);

AND l.numero > '300' AND l.numero < '1000'

O puedes acortarlo con :

AND l.numero BETWEEN '300' AND '1000'

De antemano disculpame... no fue tu culpa.  ;)


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 17:44 pm
No por favor.. nada de disculpas.. Tu me estas salvando la vida mas de 1 vez.. nada de pedir disculpas :D

Continuando con alguna que otra pregunta:

Hace un tiempo me dijeron que agregar mas de 1 o 2 indices, ya hacía mas retardada la consulta.. y que hay que saber colocarlos bien a ellos, porque sino juega en contra.. es verdad ello?

Otra consultita:
Un "PRIMARY", tambien funciona como INDICE?


Título: Re: Dudas de consulta SQL
Publicado por: ^Tifa^ en 7 Diciembre 2009, 19:40 pm
Hola.

Desconozco a ciencia cierta en que se basaron para decirte que dar uso de 2 indices retardaria una consulta. Podria retardar retornarte valores por el mero hecho de que debe indagar mas registros para dar exactamente con lo que buscas pero, es preferible de antemano usarlos ante no usarlos. Sino usas consultas basando tu busquedad en indices el motor tendra que buscar en toda la data y todos los indices para encontrar lo que buscas, y si tu motor esta en Myisam por ejemplo es aun un poco mas mortificante porque la data se divide en 2 archivos terminados en MYD = Data y MYI = indices entonces la lectura va 1 linea del archivo data y saltar a 1 linea del archivo indice, y retornar a 1 linea del archivo data y saltar a leer 1 linea del archivo indice y asi sucesivamente hasta dar con el objetivo de tu busquedad, esto genera mucho I/O en el disco cuando se hacen busquedad sin indices. Sin embargo si filtras tu busquedad por indices al menos el optimizador del motor buscara exactamente en el archivo indice y cuando de con el resultado ya sabra exactamente que registro sacar del archivo data. (Aunque todo depende de que motor de DB estemos hablando y el motor de almacenamiento en cuestion) en este caso hablo de MySQL que es el que estas usando.

Otra consultita:
Un "PRIMARY", tambien funciona como INDICE?

Sip, los primary key te crean un indice en el campo que es PK.


Título: Re: Dudas de consulta SQL
Publicado por: Skeletron en 7 Diciembre 2009, 20:24 pm
Perfecto!
Creo que no queda mas nada por preguntar :D

Muchisimas gracias! como siempre!