Ver Mensaje Individual
  #2 (permalink)  
Antiguo 22/10/2012, 08:19
leonardo_josue
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: Duda redaccion SELECT

Hola piponsio:

En primer lugar y antes que nada bienvenido al foro, y ahora si entremos en materia...

Cita:
[dejen terminar no empiesen con JOIN blabla]
Mucho ojo, si consideras que lo que te podemos decir es puro bla bla, entonces ¿qué haces en el foro? tu comentario es una total falta de respeto hacia los foristas.

Ahora bien, volviendo a tu problema... en la primer consulta, como ya te habrás dado cuenta, es un problema de columna ambigua, es decir, la columna date existe en ambas tablas, por lo tanto el motor de BD no puede determinar a cuál de las dos te refieres. La consulta 2 es correcta en cuanto a que se puede ejecutar, pero si el resultado no es el que quieres, bueno, tendrías que explicarnos mejor qué es lo que necesitas. Sin embargo tengo que poner un BLA BLA BLA acerca de los JOIN's, porque tienes un problema grave.

Tal como estás haciendo la consulta se está realizando un producto cartesiano entre tus tablas esto es porque NO ESTÁS COLOCANDO NINGUNA CONDICIÓN DE UNIÓN ENTRE TUS TABLAS. Checa este ejemplo

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+-------------+
  3. | id   | descripcion |
  4. +------+-------------+
  5. |    1 | UNO         |
  6. |    2 | DOS         |
  7. |    3 | TRES        |
  8. +------+-------------+
  9. 3 rows in set (0.11 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+-------------+
  13. | id   | descripcion |
  14. +------+-------------+
  15. |    1 | ONE         |
  16. |    2 | TWO         |
  17. |    3 | THREE       |
  18. +------+-------------+
  19. 3 rows in set (0.05 sec)
  20.  
  21. mysql> SELECT * FROM tabla1, tabla2;
  22. +------+-------------+------+-------------+
  23. | id   | descripcion | id   | descripcion |
  24. +------+-------------+------+-------------+
  25. |    1 | UNO         |    1 | ONE         |
  26. |    2 | DOS         |    1 | ONE         |
  27. |    3 | TRES        |    1 | ONE         |
  28. |    1 | UNO         |    2 | TWO         |
  29. |    2 | DOS         |    2 | TWO         |
  30. |    3 | TRES        |    2 | TWO         |
  31. |    1 | UNO         |    3 | THREE       |
  32. |    2 | DOS         |    3 | THREE       |
  33. |    3 | TRES        |    3 | THREE       |
  34. +------+-------------+------+-------------+
  35. 9 rows in set (0.00 sec)

Esto es un producto cartesiano, es decir, cada elemento de la tabla1 se une con un elemento de la tabla2... para evitar esto es necesario colocar las condiciones de unión entre las tablas:

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1, tabla2
  2.     -> WHERE tabla1.id = tabla2.id;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | UNO         |    1 | ONE         |
  7. |    2 | DOS         |    2 | TWO         |
  8. |    3 | TRES        |    3 | THREE       |
  9. +------+-------------+------+-------------+
  10. 3 rows in set (0.05 sec)

O mejor aun, utilizar JOIN's aunque pienses que es solo BLA BLA BLA

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1 INNER JOIN tabla2
  2.     -> ON tabla1.id = tabla2.id;
  3. +------+-------------+------+-------------+
  4. | id   | descripcion | id   | descripcion |
  5. +------+-------------+------+-------------+
  6. |    1 | UNO         |    1 | ONE         |
  7. |    2 | DOS         |    2 | TWO         |
  8. |    3 | TRES        |    3 | THREE       |
  9. +------+-------------+------+-------------+
  10. 3 rows in set (0.00 sec)

En cuanto a esta observación:

Cita:
me lanza las tablas pero las de la tabla 2 al lado de la tabla 1
No se qué tiene de raro ni qué es lo que esperas obtener... al colocar * en el SELECT siempre te pondrá en primer lugar todos los campos de la tabla1, después los de la tabla2 y así los de todas las tablas que listaste en el SELECT... ¿Quiéres cambiar el orden y omitir algún campo? entonces no utilices * y lista los campos como quieres que se presenten:

Código MySQL:
Ver original
  1. mysql> SELECT tabla2.descripcion, tabla1.id, tabla1.descripcion
  2.     -> FROM tabla1 INNER JOIN tabla2
  3.     -> ON tabla1.id = tabla2.id;
  4. +-------------+------+-------------+
  5. | descripcion | id   | descripcion |
  6. +-------------+------+-------------+
  7. | ONE         |    1 | UNO         |
  8. | TWO         |    2 | DOS         |
  9. | THREE       |    3 | TRES        |
  10. +-------------+------+-------------+
  11. 3 rows in set (0.00 sec)

Finalmente una recomendación: mucho ojo en utilizar nombres de campos en inglés, ya que estos pueden ocasionar problemas. DATE es en realidad un tipo de dato, así es que puedes tener problemas, te recomiendo utilizar palabras en español o si lo prefieres agregar algún calificativo a los campos. como date_compra, date_alta, etc.

Saludos
Leo.