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
Con un procedimiento almacenado (Esto es un ejemplo en MySQL); Código
Con variables temporales en una consulta SQL (Validas solo por sección de usuario): Código
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
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
Saludos Título: Re: Dudas de consulta SQL Publicado por: Skeletron en 7 Diciembre 2009, 03:55 am Código
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
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
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
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
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 (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
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
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! |