Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] Problema con consulta varias tablas

Estas en el tema de Problema con consulta varias tablas en el foro de Mysql en Foros del Web. hola buen dia llevo mi tiempo sin poder realizar la consulta que necesito tengo cinco tablas de donde necesito consulta si por un formulario donde ...
  #1 (permalink)  
Antiguo 04/04/2013, 15:15
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Problema con consulta varias tablas

hola buen dia llevo mi tiempo sin poder realizar la consulta que necesito tengo cinco tablas de donde necesito consulta si por un formulario donde traigo el dato me busque dicho campo en todas las tablas y si me encuentra algo me traiga todos los datos que necesito lo que hecho es esto pero nada.

Código MySQL:
Ver original
  1. SELECT * FROM t1.placa, t2.placa, t3.placa, t4.placa, t5.placa WHERE placa like '%$buscar%' ORDER BY placa DESC

ya dependiendo si me encuentra el dato en alguna de las tablas hago una impresion pero ello ya no es una consulta en MYSQL por ello no la pongo aqui, bueno espero una ayuda al respecto ya que en otros temas me han colaborado bastante y me han dado ideas al respecto pero aqui no se que este haciendo mal.
__________________
edwinarley
  #2 (permalink)  
Antiguo 04/04/2013, 15:39
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problema con consulta varias tablas

Hola edwinarley:

Estás cometiendo errores infantiles en tu consulta, creo que deberías de darle un vistazo a cualquier libro de SQL para principiantes, porque sinceramente pocas veces había visto algo como tu consulta.

Vayamos por partes... al Tablar de T1, T2... T5 supongo que te refieres a tus tablas, es decir, tienes 5 tablas y todas tienen un atributo placa correcto???pues bien, comencemos.

Primero. En la sección FROM de tu consulta debes pones LAS TABLAS QUE VAS A INVOLUCRAR, NO LOS CAMPOS, los campos se utilizan en el SELECT, WHERE, GROUP BY, HAVING, y ORDER BY...

Segundo. en la sección WHERE cuando dos o más tablas TIENEN EL MISMO NOMBRE DE CAMPO DEBES ESPECIFICAR A QUÉ TABLA PERTENECE EL CAMPO AL QUE HACER REFERENCIA, de lo contrario te marcará que el nombre del campo es ambiguo. (Lo mismo aplica para el ORDER BY).

Tercero. Listar las tablas en el FROM, tal como lo haces indica JOIN's, y al no poner ningúna condición de unión en el WHERE se estaría realizando un PRODUCTO CARTESIANO.

No quiero perder mucho tiempo en esto, pero insisto, te recomiendo que leas cualquier libro para principiantes para entender todos estos conceptos.

Lo que tú tienes que hacer es utilizar UNION, en lugar de listar las tablas en el FROM. Checa la documentación para que sepas cuáles son las restricciones para poder hacer la unión entre las tablas.

http://dev.mysql.com/doc/refman/5.0/es/union.html

Una vez unidas, puedes hacer un SELECT sobre la tabla resultante, filtrando los resultados que quieras:

Código MySQL:
Ver original
  1.   SELECT * FROM T1
  2.   SELECT * FROM T2
  3.   SELECT * FROM T3
  4.   SELECT * FROM T4
  5.   SELECT * FROM T5) T
  6. WHERE T.placa LIKE '%$buscar%' ORDER BY T.placa DESC


Insisto en que este tipo de consultas es básica, por lo que puedo suponer que apenas estás aprendiendo SQL, tienes un largo camino por recorrer, revisa la documentación oficial, encomíendate a SAN GOOGLE y pídele que te ilumine con su sabiduría.

Saludos
Leo.
  #3 (permalink)  
Antiguo 04/04/2013, 15:51
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

curioso pero he realizado otras cosas mas complicadas que esto como formateo de archivos planos, defireciacion en consultas y otras mas pero nada, ahora gracias por su consejo de leer un tuto, pero nada ya hice igual al que me dejo y nada

Código MySQL:
Ver original
  1. SELECT * FROM t1 WHERE placa like '%$buscar%' ORDER BY placa DESC
  2. SELECT * FROM t2 WHERE placa like '%$buscar%' ORDER BY placa DESC
  3. SELECT * FROM t3 WHERE placa like '%$buscar%' ORDER BY placa DESC
  4. SELECT * FROM t4 WHERE placa like '%$buscar%' ORDER BY placa DESC
  5. SELECT * FROM t5 WHERE placa like '%$buscar%' ORDER BY placa DESC

y ni asi funciona el error es este

Warning: mysql_num_rows(): supplied argument is not a valid MySQL result
__________________
edwinarley
  #4 (permalink)  
Antiguo 04/04/2013, 16:08
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problema con consulta varias tablas

Mucho cuidado edwinarley:

Cuando se te pida que leas la documentación HAZLO , porque sigues cometiendo errores infantiles... La liga que te puse indica la sintaxis que tienes que poner para usar el UNION, si lees, hay una parte que dice

Cita:
Si quiere usar una cláusula ORDER BY o LIMIT para ordenar o limitar el resultado UNION entero, ponga entre paréntesis los comandos SELECT individuales y ponga el ORDER BY o LIMIT tras el último. El siguiente ejemplo usa ambas cláusulas:

Código MySQL:
Ver original
  1. (SELECT a FROM tbl_name WHERE a=10 AND B=1)
  2. (SELECT a FROM tbl_name WHERE a=11 AND B=2)
Otra cosa importante, el error que colocas NO ES UN ERROR DE MYSQL, es un error de PHP, son dos cosas absolutamente distintas... Este foro es de MySQL y por lo tanto debes enfocarte sólo es eso... ejecuta las consultas directamente en una consola de MySQL, no desde tu página de PHP, y si necesitas ayuda en PHP entonces publica tu pregunta en el foro correspondiente:

http://www.forosdelweb.com/f18/

Checa este script, aquí aparecen dos soluciones, una como te dice la documentación oficial y otra que es como yo te dije desde mi primer post.

Código MySQL:
Ver original
  1. mysql> SELECT * FROM T1;
  2. +----------+
  3. | placa    |
  4. +----------+
  5. | uno-1    |
  6. | dos-2    |
  7. | tres-3   |
  8. | cuatro-4 |
  9. +----------+
  10. 4 rows in set (0.00 sec)
  11.  
  12. mysql> SELECT * FROM T2;
  13. +-----------+
  14. | placa     |
  15. +-----------+
  16. | uno-10    |
  17. | dos-20    |
  18. | tres-30   |
  19. | cuatro-40 |
  20. +-----------+
  21. 4 rows in set (0.00 sec)
  22.  
  23. mysql> (SELECT * FROM t1 WHERE placa LIKE '%dos%')
  24.     -> UNION
  25.     -> (SELECT * FROM t2 WHERE placa LIKE '%dos%')
  26.     -> ORDER BY placa DESC;
  27. +--------+
  28. | placa  |
  29. +--------+
  30. | dos-20 |
  31. | dos-2  |
  32. +--------+
  33. 2 rows in set (0.00 sec)
  34.  
  35. mysql> SELECT * FROM
  36.     -> ( SELECT * FROM T1
  37.     ->   UNION ALL
  38.     ->   SELECT * FROM T2 ) T
  39.     -> WHERE T.placa LIKE '%dos%'
  40.     -> ORDER BY T.placa;
  41. +--------+
  42. | placa  |
  43. +--------+
  44. | dos-2  |
  45. | dos-20 |
  46. +--------+
  47. 2 rows in set (0.00 sec)

Saludos
Leo.
  #5 (permalink)  
Antiguo 04/04/2013, 16:24
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

entiendo pero veo que aun me sale el mensaje de error, que le comento, la consulta la paso por un ejecutor de sql y se queda colgada y me bloquea la maquina, bueno una cosa sencilla no es tan sencilla como se ve
__________________
edwinarley
  #6 (permalink)  
Antiguo 04/04/2013, 16:31
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problema con consulta varias tablas

Son cosas muy distintas que la consulta te marque algún error y que se quede "colgada".

La consulta funciona, y para eso está el script de ejemplo... no hay ningún error.

Si tus tablas son muy grandes, si no tienes definidos índices, si tienes una mala configuración en tu servidor, si tienes muchos usuarios concurrentes y un largo etcétera pueden estar ocasionando que tu consulta no se ejecute.

Saludos
Leo.
  #7 (permalink)  
Antiguo 04/04/2013, 16:33
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

si las tablas tienen entre 165.000 registros y hasta mas
__________________
edwinarley
  #8 (permalink)  
Antiguo 05/04/2013, 08:12
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

bueno despues de unos tintos toda la noche y mirar y probar codigo en el gestor de base de datos ya me sale la consulta en el gestor bueno al menos me dice que si encontro registros, verifico con la base y si respectivamente solo hay un registro. pero ahora no me muestra los resultados pero ello ya no es de este foro. en fin este men con programacion INfantil como se lo dicen a todos lo logro. en fin aqui dejo el codigo para los que llegen a necesitarlo.

Código MySQL:
Ver original
  1. SELECT placa FROM t1 WHERE placa LIKE '%$buscar%'
  2. UNION (SELECT placa FROM t1 WHERE placa LIKE '%$buscar%')
  3. UNION (SELECT placa FROM t2 WHERE placa LIKE '%$buscar%')
  4. UNION (SELECT placa FROM t3 WHERE placa LIKE '%$buscar%')
  5. UNION (SELECT placa FROM t4 WHERE placa LIKE '%$buscar%')
  6. UNION (SELECT placa FROM t5 WHERE placa LIKE '%$buscar%')

bueno si me llegara a fallar estare por aqui otra vez aunque esta probado en SQL-FRONT
__________________
edwinarley
  #9 (permalink)  
Antiguo 05/04/2013, 13:55
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

Cita:
Iniciado por edwinarley Ver Mensaje
bueno despues de unos tintos toda la noche y mirar y probar codigo en el gestor de base de datos ya me sale la consulta en el gestor bueno al menos me dice que si encontro registros, verifico con la base y si respectivamente solo hay un registro. pero ahora no me muestra los resultados pero ello ya no es de este foro. en fin este men con programacion INfantil como se lo dicen a todos lo logro. en fin aqui dejo el codigo para los que llegen a necesitarlo.

Código MySQL:
Ver original
  1. SELECT placa FROM t1 WHERE placa LIKE '%$buscar%'
  2. UNION (SELECT placa FROM t1 WHERE placa LIKE '%$buscar%')
  3. UNION (SELECT placa FROM t2 WHERE placa LIKE '%$buscar%')
  4. UNION (SELECT placa FROM t3 WHERE placa LIKE '%$buscar%')
  5. UNION (SELECT placa FROM t4 WHERE placa LIKE '%$buscar%')
  6. UNION (SELECT placa FROM t5 WHERE placa LIKE '%$buscar%')

bueno si me llegara a fallar estare por aqui otra vez aunque esta probado en SQL-FRONT
Bueno lo que logre en la noche me dio una luz a lo que necesito al igual que leo, aunque un poco duro con sus palabras, me funciona bien la consulta pero como hago el SELECT del campo placa nada mas me trae ese dato, y necesito el resto de datos que van con ese campo en relacion.
para ello ley el tuto que leo deja pero al organizar la idea y al pasarlo por el gestor no corre diciendo que no es valida la sentencia esto es lo que tengo
Código MySQL:
Ver original
  1. SELECT * FROM t1 WHERE placa LIKE '%$buscar%'
  2. (SELECT * FROM t2 WHERE placa LIKE '%$buscar%')
  3. (SELECT * FROM t3 WHERE placa LIKE '%$buscar%')
  4. (SELECT * FROM t4 WHERE placa LIKE '%$buscar%')
  5. (SELECT * FROM t5 WHERE placa LIKE '%$buscar%')

el error es el comando select tiene diferente numero de columnas, de ello deduzco que la t1 tiene 9 columnas, t2 tiene 12 etc ahora si es por esto como traigo todos los datos relacionados con placa.
__________________
edwinarley
  #10 (permalink)  
Antiguo 05/04/2013, 14:17
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: Problema con consulta varias tablas

Cita:
como traigo todos los datos relacionados con placa.
Simple y complicado: No puedes usar el asterisco. Deberás indicar una a una las columnas asegurándote de que tengan el mismo orden y sean del mismo tipo en cada columna.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #11 (permalink)  
Antiguo 05/04/2013, 15:20
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

Cita:
Iniciado por gnzsoloyo Ver Mensaje
Simple y complicado: No puedes usar el asterisco. Deberás indicar una a una las columnas asegurándote de que tengan el mismo orden y sean del mismo tipo en cada columna.
jajajaja si claro ya lo habia echo, no me supe expresar la problematica que tengo es que en los resultado de cada tabla son diferentes me explico si la placa es AAA258 y me la encuenta en la t2 que tiene 13 campos para mostrar o imprimir con el echo, listo hasta hay bien, pero si busco la placa IOH569 y es de la tabla t4 que tiene 15 campos para mostrar o imprimir el echo hay es donde sale el error del SELECT por columnas ejecutado en el gestor de base de datos, ahora hay si no se como hacer para evitar ese error. una solucion no viable agregar los otros campos para que todos los resultados sean con el mismo formulario que los muestra pero no es logico agregar campos a la tabla y dejarlos vacios por que si.

hay si hace 9 años que no recuerdo haber visto eso en la universidad........
__________________
edwinarley
  #12 (permalink)  
Antiguo 05/04/2013, 15:25
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problema con consulta varias tablas

Hola de nuevo edwinarley:

Tal como lo comenta gnzsoloyo, el problema es que no puedes hacer UNION's si el resultado de cada unos de los SELECT's independientes tiene un numero distinto de columnas o incluso un tipo distinto para columnas correspondientes... Eso te lo quise hacer notar desde el primer post que te puse, igual y te parecieron duras mis palabras, pero lo menos que podemos esperar es algo de iniciativa por parte de los foristas...

En mi Primer post de decía:

Cita:
Checa la documentación para que sepas cuáles son las restricciones para poder hacer la unión entre las tablas.

http://dev.mysql.com/doc/refman/5.0/es/union.html
Este error es una de las restricciones que quería hacer notar. Si hubieras puesto atención a lo que dice la liga, en el primer párrafo aparece textualmente esto:

Cita:
Las columnas seleccionadas lisatadas en posiciones correspondientes de cada comando SELECT deben tener el mismo tipo
Que es lo que te acaba de contestar gnzsoloyo

Mucho ojo, no esperes encontrar en este foro una respuesta sólo para copiar y pegar, ya te lo había comentado... trata de investigar un poco por tu cuenta, pregúntale a SAN GOOGLE, el es muy sabio y tiene muchísmos ejemplos que te pueden ayudar, y por supuesto aquí seguiremos tratar de apoyar en lo que podamos.

Y si, una solución es poner campos nulos en aquellas tablas donde no puedas necesites completar el número de campos... pero ojo, no agregar "Físicamente" los campos sino simplemente hacer algo como esto:

Código:
SELECT campo1, campo2, null campo3, null campo4...
UNION
SELECT campo1, campo2, campo3, campo4
Saludos
Leo.
  #13 (permalink)  
Antiguo 05/04/2013, 15:40
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

entiendo leo gracias a lo mejor desde un principio no me supe explicar, pero deverdad gracias, buscare una solucion a mi inquietud en GOOGLE si no encuentro algo o una idea que me guie mirare la opcion que le comente con los campos aunque no es lo mas sabio, tan pronto tenga el codigo lo posteare para guia de otros colegas.
y de nuevo gracias leo.
__________________
edwinarley
  #14 (permalink)  
Antiguo 05/04/2013, 15:55
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Problema con consulta varias tablas

Hola de nuevo...

Insisto, no hay necesidad de agregar los campos de manera física a la tabla, simplemente tienes que agregar los campos como NULL, pero desde el select... checa este ejemplo:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM t1;
  2. +----------+------------+
  3. | placa    | estado     |
  4. +----------+------------+
  5. | uno-1    | texas      |
  6. | dos-2    | california |
  7. | tres-3   | new york   |
  8. | cuatro-4 | NULL       |
  9. +----------+------------+
  10. 4 rows in set (0.09 sec)
  11.  
  12. mysql> SELECT * FROM t2;
  13. +-----------+-------------+
  14. | placa     | propietario |
  15. +-----------+-------------+
  16. | uno-10    | Hugo        |
  17. | dos-20    | Paco        |
  18. | tres-30   | Luis        |
  19. | cuatro-40 | Pepe        |
  20. +-----------+-------------+
  21. 4 rows in set (0.00 sec)
  22.  
  23. mysql> SELECT * FROM t3;
  24. +------------+----------+-------------+
  25. | placa      | estado   | propietario |
  26. +------------+----------+-------------+
  27. | otro-uno-1 | Illinois | David       |
  28. | otro-dos-2 | Tennese  | Jorge       |
  29. +------------+----------+-------------+
  30. 2 rows in set (0.00 sec)

observa que las tres tablas tienen el campo placa (que es el que te interesa para la búsqueda) la primer tabla tiene estado, pero no tiene propietario, la segunda tabla tiene propietario, pero no tiene estado, y la tercer tabla si posee los tres campos... tú podrías hacer esto:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM (
  2.     ->   SELECT placa, estado, NULL propietario FROM t1
  3.     ->   UNION ALL
  4.     ->   SELECT placa, NULL estado, propietario FROM t2
  5.     ->   UNION ALL
  6.     ->   SELECT placa, estado, propietario FROM t3
  7.     -> ) T
  8.     -> WHERE
  9.     -> placa LIKE '%dos%';
  10. +------------+------------+-------------+
  11. | placa      | estado     | propietario |
  12. +------------+------------+-------------+
  13. | dos-2      | california | NULL        |
  14. | dos-20     | NULL       | Paco        |
  15. | otro-dos-2 | Tennese    | Jorge       |
  16. +------------+------------+-------------+
  17. 3 rows in set (0.00 sec)

De manera programática podrías darle tratamiento a estos campos NULOS, pero sin alterar tu modelo de BD.

Saludos
Leo.
  #15 (permalink)  
Antiguo 05/04/2013, 16:12
 
Fecha de Ingreso: abril-2012
Ubicación: colombia
Mensajes: 62
Antigüedad: 12 años
Puntos: 0
Información Respuesta: Problema con consulta varias tablas

exacto leo ya lo hice en el gestor de base de datos y bien funciona como habiamos conversado en el foro sin agregar campos a las tablas simplemente agrege los campos NULL en el selet donde me hicieran falta, por ahora bien ya me muestra datos antes nada, ahora me queda la tarea de realizar bien las impresiones pues como son tablas diferentes pero ese tema ya no es de este foro eso es PHP. igual vuelvo y lo digo gracias por la dureza que me hizo reaccionar y por sus aportes que bien me sirvieron para guiarme. cualquier cosa comentare.
__________________
edwinarley

Etiquetas: campo, sql, tabla, tablas
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 15:06.