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

[SOLUCIONADO] Duda redaccion SELECT

Estas en el tema de Duda redaccion SELECT en el foro de Mysql en Foros del Web. tengo un problema y e buscado muchas soluciones y ninguna me ha servido lo que deseo es hacer una consulta a 2 tablas [dejen terminar ...
  #1 (permalink)  
Antiguo 20/10/2012, 23:43
Avatar de piponsio  
Fecha de Ingreso: octubre-2012
Mensajes: 29
Antigüedad: 11 años, 5 meses
Puntos: 0
Pregunta Duda redaccion SELECT

tengo un problema y e buscado muchas soluciones y ninguna me ha servido lo que deseo es hacer una consulta a 2 tablas [dejen terminar no empiesen con JOIN blabla] y ordenarlas por un campo en comun que seria date

pero si ago esto

SELECT * FROM tabla1,tabla2 ORDER BY date ---> sale Column 'date' in order clause is ambiguous

Y si la ago de este modo

SELECT * FROM tabla1,tabla2 ORDER BY tabla1.date, tabla2.date

me lanza las tablas pero las de la tabla 2 al lado de la tabla 1 :/ :S HELP ME !
  #2 (permalink)  
Antiguo 22/10/2012, 08:19
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.
  #3 (permalink)  
Antiguo 26/10/2012, 15:38
Avatar de piponsio  
Fecha de Ingreso: octubre-2012
Mensajes: 29
Antigüedad: 11 años, 5 meses
Puntos: 0
De acuerdo Respuesta: Duda redaccion SELECT

Cita:
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.
Mucha Razon mil disculpas

Como anteriormente dije tengo 2 tablas:

post1, post2

hice 2 tablas por que la informacion a guardar es distinta pero todas siguen siendo post

Código MySQL:
Ver original
  1. post 1
  2. +------+-------------+------+
  3. | id   | titulo      | date |
  4. +------+-------------+------+
  5. |    1 | artista     |  11-2|
  6. |    2 | disco       |  11-3|
  7. |    3 | letra       |  12-2|
  8. +------+-------------+------+
  9.  
  10.  
  11. post 2
  12. +------+-------------+------+
  13. | id   | titulo      |date  |
  14. +------+-------------+------+
  15. |    1 | programa    | 12-2 |
  16. |    2 | programa    | 14-2 |
  17. |    3 | THREE       | 16-2 |
  18. +------+-------------+------+

Y al hacer la consulta estas ordenarlas por su fecha en este caso "date"

1 artista 11-2
1 programa 12-2
2 disco 12-2
2 programa 14-2
3 THERE 16-2
2 disco 11-3

Algo asi si es necesario mensionar JOIN o algun otro por favor hacer pero con una breve introduccion ya que no soy un maestro en el tema de ante mano muchas gracias

PD: como manejar bien el hacer tablas ?
  #4 (permalink)  
Antiguo 29/10/2012, 09:15
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 de nuevo piponsio:

Cuando trabajas con fechas entonces lo que tienes que hacer es manejar los campos como tipo DATE o DATETIME... hacerlo con cualquier otra forma es un completo error de diseño, que sólo te traerá dolores de cabeza.

No lo especificas directamente en el post, pero supongo que estás almacenando los datos como varchar... ¿la cifra antes del guión representa el día? ¿La cifra después del guión representa el mes?, ¿qué pasa con el año, no te interesa en absoluto?

Para presentar la información como quieres, en primer lugar tienes que usar UNION...

Cita:
Algo asi si es necesario mensionar JOIN o algun otro por favor hacer pero con una breve introduccion ya que no soy un maestro en el tema de ante mano muchas gracias
Como introducción checa esta liga
http://lmgtfy.com/?q=ejemplos+UNION+mySQL

Para lo de la ordenación, tienes de dos sopas, una sería cambiar tu modelo de datos y ponerlo como tipo DATE y quitarte de problemas o en su defecto, no puedes o no quieres cambiar tu modelo tendrías que extraer la primer cifra y convertirla a tipo numérico y después extraer la segunda cifra y también convertirla a numero... como introducción

http://dev.mysql.com/doc/refman/5.0/...functions.html
(Función SUBSTRING)

http://dev.mysql.com/doc/refman/5.0/...functions.html
(Función CAST)

Si continuas con problemas, postea algo de lo que intentaste hacer y con gusto te ayudamos a corregirlo.

Saludos
Leo.
  #5 (permalink)  
Antiguo 29/10/2012, 19:36
Avatar de piponsio  
Fecha de Ingreso: octubre-2012
Mensajes: 29
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Duda redaccion SELECT

hola de nuevo si el ejemplo que había posteado anteriormente era solo un ejemplo, planeo poner en esa columna la fecha día-mes-año hora:minutos:segundo.
Cita:
una sería cambiar tu modelo de datos y ponerlo como tipo DATE
dices que si esa columna la cambio a tipo date podría hacer la consulta y ordenarlas por la columna date con su respectivo formato no me daría un error de valor ambiguo ? eso intentare muchas gracias si no resulta lo estaré posteando en el foro como recomendaste :D
  #6 (permalink)  
Antiguo 30/10/2012, 09:58
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...

Cita:
no me daría un error de valor ambiguo ?
No, en con el UNION no tendrías el problema de columna ambigua, ya que la ordenación se realiza sobre el resultado de la unión, no sobre cada subconsulta...

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+---------+------------+
  3. | id   | titulo  | fecha      |
  4. +------+---------+------------+
  5. |    1 | artista | 2012-02-11 |
  6. |    2 | disco   | 2012-03-11 |
  7. |    3 | letra   | 2012-02-12 |
  8. +------+---------+------------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+----------+------------+
  13. | id   | titulo   | fecha      |
  14. +------+----------+------------+
  15. |    1 | programa | 2012-02-12 |
  16. |    2 | programa | 2012-02-14 |
  17. |    3 | THREE    | 2012-02-16 |
  18. +------+----------+------------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT id, titulo, fecha FROM tabla1
  22.     -> UNION
  23.     -> SELECT id, titulo, fecha FROM tabla2
  24.     -> ORDER BY fecha;
  25. +------+----------+------------+
  26. | id   | titulo   | fecha      |
  27. +------+----------+------------+
  28. |    1 | artista  | 2012-02-11 |
  29. |    1 | programa | 2012-02-12 |
  30. |    3 | letra    | 2012-02-12 |
  31. |    2 | programa | 2012-02-14 |
  32. |    3 | THREE    | 2012-02-16 |
  33. |    2 | disco    | 2012-03-11 |
  34. +------+----------+------------+
  35. 6 rows in set (0.00 sec)

Saludos
Leo.
  #7 (permalink)  
Antiguo 31/10/2012, 21:34
Avatar de piponsio  
Fecha de Ingreso: octubre-2012
Mensajes: 29
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Duda redaccion SELECT

Muchas Gracias Hasta ahora Voy OK pero me surgio un problema y creo que UNION no sera mi solucion...

ya que entre la tabla 1 y la tabla 2 solo algunas columnas son iguales como el titulo, imagen, fecha pero tambien hay columnas que no tiene relacion y quiero que esos datos no se junten como sucede a continuacion

Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+---------+------------+------------+
  3. | id   | titulo  | fecha      | type       |
  4. +------+---------+------------+------------+
  5. |    1 | artista | 2012-02-11 | typo 1     |
  6. |    2 | disco   | 2012-03-11 | typo 2     |
  7. |    3 | letra   | 2012-02-12 |tipo 3 xD   |
  8. +------+---------+------------+------------+
  9. 3 rows IN SET (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+----------+------------+------------+
  13. | id   | titulo   | fecha      | contenido  |
  14. +------+----------+------------+------------+
  15. |    1 | programa | 2012-02-12 | vlalvals   |
  16. |    2 | programa | 2012-02-14 |asdkajlsd   |
  17. |    3 | THREE    | 2012-02-16 |asdjas      |
  18. +------+----------+------------+------------+
  19. 3 rows IN SET (0.00 sec)
  20.  
  21. mysql> SELECT id, titulo, fecha, type FROM tabla1
  22.     -> UNION
  23.     -> SELECT id, titulo, fecha, contenido FROM tabla2
  24.     -> ORDER BY fecha;
  25.  
  26. +------+----------+------------+------------+
  27. | id   | titulo   | fecha      | type       |
  28. +------+----------+------------+------------+
  29. |    1 | artista  | 2012-02-11 | typo 1     |
  30. |    1 | programa | 2012-02-12 | vlalvals   |
  31. |    3 | letra    | 2012-02-12 |tipo 3 xD   |
  32. |    2 | programa | 2012-02-14 |asdkajlsd   |
  33. |    3 | THREE    | 2012-02-16 |asdjas      |
  34. |    2 | disco    | 2012-03-11 | typo 2     |
  35. +------+----------+------------+------------+

Y yo Quiero que quede Así

Código MySQL:
Ver original
  1. +------+----------+------------+------------+------------+
  2. | id   | titulo   | fecha      | type       | contenido  |
  3. +------+----------+------------+------------+------------+
  4. |    1 | artista  | 2012-02-11 | typo 1     |            |
  5. |    1 | programa | 2012-02-12 |            | vlalvals   |
  6. |    3 | letra    | 2012-02-12 |tipo 3 xD   |            |
  7. |    2 | programa | 2012-02-14 |            |asdkajlsd   |
  8. |    3 | THREE    | 2012-02-16 |            |asdjas      |
  9. |    2 | disco    | 2012-03-11 | typo 2     |            |
  10. +------+----------+------------+------------+------------+

Espero darme a entender esa es mi intención final De ante mano muchas gracias
  #8 (permalink)  
Antiguo 01/11/2012, 08:58
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 de nuevo:

Si leíste la documentación de las ligas que te mandé, te habrás dado cuenta una restricción que se tiene es que las consultas deben regresar el mismo número de columnas, sin embargo, estas columnas NO NECESARIAMENTE DEBEN PERTENECER A LA TABLA, es decir, puedes "crear" columnas ficticias o campos calculados para igual el número de columnas... en tu caso, la tabla1 NO CONTIENE EL CAMPO CONTENIDO pero si tiene la columna TIPO. Para el caso de la tabla2 es lo inverso, de tal suerte que simplemente tienes que hacer algo como esto:


Código MySQL:
Ver original
  1. mysql> SELECT * FROM tabla1;
  2. +------+---------+------------+-----------+
  3. | id   | titulo  | fecha      | tipo      |
  4. +------+---------+------------+-----------+
  5. |    1 | artista | 2012-02-11 | typo 1    |
  6. |    2 | disco   | 2012-03-11 | typo 2    |
  7. |    3 | letra   | 2012-02-12 | tipo 3 xD |
  8. +------+---------+------------+-----------+
  9. 3 rows in set (0.00 sec)
  10.  
  11. mysql> SELECT * FROM tabla2;
  12. +------+----------+------------+-----------+
  13. | id   | titulo   | fecha      | contenido |
  14. +------+----------+------------+-----------+
  15. |    1 | programa | 2012-02-12 | vlalvals  |
  16. |    2 | programa | 2012-02-14 | asdkajlsd |
  17. |    3 | THREE    | 2012-02-16 | asdjas    |
  18. +------+----------+------------+-----------+
  19. 3 rows in set (0.00 sec)
  20.  
  21. mysql> SELECT id, titulo, fecha, tipo, NULL contenido
  22.     -> FROM tabla1
  23.     -> UNION
  24.     -> SELECT id, titulo, fecha, NULL tipo, contenido
  25.     -> FROM tabla2
  26.     -> ORDER BY fecha;
  27. +------+----------+------------+-----------+-----------+
  28. | id   | titulo   | fecha      | tipo      | contenido |
  29. +------+----------+------------+-----------+-----------+
  30. |    1 | artista  | 2012-02-11 | typo 1    | NULL      |
  31. |    3 | letra    | 2012-02-12 | tipo 3 xD | NULL      |
  32. |    1 | programa | 2012-02-12 | NULL      | vlalvals  |
  33. |    2 | programa | 2012-02-14 | NULL      | asdkajlsd |
  34. |    3 | THREE    | 2012-02-16 | NULL      | asdjas    |
  35. |    2 | disco    | 2012-03-11 | typo 2    | NULL      |
  36. +------+----------+------------+-----------+-----------+
  37. 6 rows in set (0.00 sec)

Es decir, colocas COLUMNAS VACIAS (NULL) en cada caso, para que la información no quede mezclada.

Y nuevamente te hago esta observación que también te hice desde el primer post, por si no la tomaste en cuenta:

Cita:
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.
Lo mismo para con la palabra TYPE...

Saludos
Leo.

Última edición por leonardo_josue; 01/11/2012 a las 09:03
  #9 (permalink)  
Antiguo 01/11/2012, 10:56
Avatar de piponsio  
Fecha de Ingreso: octubre-2012
Mensajes: 29
Antigüedad: 11 años, 5 meses
Puntos: 0
Respuesta: Duda redaccion SELECT

Solo eran ejemplos ya me paso una vez haciendo una función en php llamada head() haksjdhaskjd muchas gracias perdón por molestar tanto :D

Etiquetas: select
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 08:42.