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

Unión de resultados... SELECT anidado o qué?

Estas en el tema de Unión de resultados... SELECT anidado o qué? en el foro de Mysql en Foros del Web. (Perdón el título, pero este tema me tiene un poco descerebrado y ya no puedo pensar) Explico primero el propósito: presentar un listado de alojamientos ...
  #1 (permalink)  
Antiguo 25/10/2011, 15:24
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Unión de resultados... SELECT anidado o qué?

(Perdón el título, pero este tema me tiene un poco descerebrado y ya no puedo pensar)

Explico primero el propósito: presentar un listado de alojamientos agrupados por 1) ciudad y 2) tipo.

Estoy usando Wordpress (acá está el diagrama de la estructura de datos) y, como no tiene ninguna función para hacer lo que deseo (el ordenamiento o agrupamiento aquel), tengo que meter mano directamente a la BD... pero me sobrepasó. Sobre todo al darme cuenta que el nombre de la "ciudad" y el nombre del "tipo" salen del mismo campo.

Tengo dos sentencias SQL, que a continuación coloco, que me devuelven los siguentes resultados (de ejemplo):

Código:
query 1: en la taxonomía (wp_term_taxonomy.taxonomy) 'category' están las ciudades como términos (wp_terms.name)

SELECT   wp_terms.name, wp_posts.* FROM wp_posts  INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) INNER JOIN wp_terms ON (wp_term_taxonomy.term_id = wp_terms.term_id)  WHERE 1=1  AND wp_posts.post_type = 'alojamiento' AND (wp_posts.post_status = 'publish') AND wp_term_taxonomy.taxonomy = 'category'  ORDER BY wp_terms.name ASC

ID	name
110	Ciudad1
61	Ciudad1
80	Ciudad1
82	Ciudad1
78	Ciudad1
76	Ciudad2

Código:
query 2: en la taxonomía (wp_term_taxonomy.taxonomy) 'tipo' están los tipos como términos (wp_terms.name)

SELECT   wp_terms.name, wp_posts.* FROM wp_posts  INNER JOIN wp_term_relationships ON (wp_posts.ID = wp_term_relationships.object_id) INNER JOIN wp_term_taxonomy ON (wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id) INNER JOIN wp_terms ON (wp_term_taxonomy.term_id = wp_terms.term_id)  WHERE 1=1  AND wp_posts.post_type = 'alojamiento' AND (wp_posts.post_status = 'publish') AND wp_term_taxonomy.taxonomy = 'tipo'  ORDER BY wp_terms.name ASC

ID	name
78	Cabaña
82	Camping
110	Hotel
80	Hotel
76	Hotel
61	Posada
Y necesito hacer "una mezcla" de ellas... es decir, anexar el campo name de la segunda a la primera y... además debe quedar ordenado por name (query 1) ASC, name (query 2) ASC

Código:
query deseada:

ID	name (query 1)	name (query 2)
78	Ciudad1		Cabaña
82	Ciudad1		Camping
110	Ciudad1		Hotel
80	Ciudad1		Hotel
61	Ciudad1		Posada
76	Ciudad2		Hotel


Debería hacr algo así?:

Código:
SELECT   wp_terms.name AS name_query_1, (SELECT wp_terms.name FROM... ¿WHERE?) AS name_query_2, wp_posts.* FROM [... BLA!... ]
Me estoy explicando bien?
__________________
...___...
  #2 (permalink)  
Antiguo 25/10/2011, 15:48
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Unión de resultados... SELECT anidado o qué?

Unos minutos ausente del monitor me despejaron un poco: ¿Y si mejor hago lo siguiente? Pseudo:

FOR EACH ciudad IN ciudades
mostrar(ciudad)
ejecutar('query ordenada por tipo')
END FOR
__________________
...___...
  #3 (permalink)  
Antiguo 25/10/2011, 17:03
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Unión de resultados... SELECT anidado o qué?

Esta sería una aproximación algo tosca, pero por acá andaría la cosa:
Código MySQL:
Ver original
  1. SELECT  
  2.     TR.name,
  3.     T1.name Categoria,
  4.     T2.name tipo
  5.     wp_posts  P
  6.     INNER JOIN
  7.     wp_term_relationships R ON P.ID = R.object_id
  8.     INNER JOIN
  9.     (SELECT * FROM wp_term_taxonomy WHERE taxonomy = 'category') T1 ON (R.term_taxonomy_id = T1.term_taxonomy_id
  10.     INNER JOIN
  11.     (SELECT * FROM wp_term_taxonomy WHERE taxonomy = 'tipo') T2 ON (R.term_taxonomy_id = T1.term_taxonomy_id
  12.     INNER JOIN
  13.     wp_terms TR ON (T1.term_id = TR.term_id)  
  14.     P.post_type = 'alojamiento' AND P.post_status = 'publish' AND T.taxonomy IN('tipo', 'category')
  15.     T1.name, T2.name ASC;
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #4 (permalink)  
Antiguo 25/10/2011, 20:47
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Unión de resultados... SELECT anidado o qué?

Tosco? En serio? Yo lo veo muy lindo. No lo entiendo -hasta no estudiarlo bien-, pero de que está lindo no me queda ninguna duda.

Mañana lo pruebo y te comento. Gracias!
__________________
...___...
  #5 (permalink)  
Antiguo 26/10/2011, 08:30
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Unión de resultados... SELECT anidado o qué?

Definitivamente no lo entiendo. A ver, le agregué paréntesis de cierre en las líneas 10 y 12.
Luego dio Unknown column 'T1.name (y T2.name también)' in 'field list' (líneas 3 y 4 [y 18 *]) y, claro, porque T1 (y T2) son la tabla wp_term_taxonomy. Y allí no existe el campo name. Existen T[1/2].taxonomy y TR.name. Así que me arriesgué (ya que no sé qué estoy haciendo realmente) y los reemplacé por T[1/2].taxonomy.

(esto ya es un despelote de BBCODES FONT="Courier New")

Vuelvo a ejecutar y MySQL-Front me dice.

Cita:
Error de ejecución SQL # 1054. Respuesta de la base de datos:
Unknown column 'T.taxonomy' in 'where clause'
Y ahí que pongo? T1, T2? Ok, pruebo los 2 (modificando esto también *) y me da un resultado que no espero (agrego el campo P.ID en la línea 1):


Código:
ID	name		Categoria		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
61	Ciudad1		category		tipo
....
... y lo mismo para los restantes 5 registros. O sea, cada registro repetido 8 veces. 6*8 = 48 registros cuando deberían ser 6.


Finalmente el query lo dejé así:



Código MySQL:
Ver original
  1.         P.ID, TR.name,
  2.         T1.taxonomy Categoria,
  3.         T2.taxonomy tipo
  4.     FROM
  5.         wp_posts  P
  6.         INNER JOIN
  7.         wp_term_relationships R ON P.ID = R.object_id
  8.         INNER JOIN
  9.         (SELECT * FROM wp_term_taxonomy WHERE taxonomy = 'category') T1 ON (R.term_taxonomy_id = T1.term_taxonomy_id)
  10.         INNER JOIN
  11.         (SELECT * FROM wp_term_taxonomy WHERE taxonomy = 'tipo') T2 ON (R.term_taxonomy_id = T1.term_taxonomy_id)
  12.         INNER JOIN
  13.         wp_terms TR ON (T1.term_id = TR.term_id)  
  14.     WHERE
  15.         P.post_type = 'alojamiento' AND P.post_status = 'publish' AND T1.taxonomy IN('tipo', 'category')
  16.     ORDER BY
  17.         T1.taxonomy, T2.taxonomy ASC;


Nada... sólo si tenés ganas. Porque me parece que lo voy a hacer como dije antes: obteniendo el listado de ciudades y por cada una de ellas ejecutar la query que me devuelva sus alojamientos ordenados por tipo.

Gracias
__________________
...___...
  #6 (permalink)  
Antiguo 26/10/2011, 08:45
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 17 años
Puntos: 2658
Respuesta: Unión de resultados... SELECT anidado o qué?

Hay que hacer pruebas concretas...
¿Te animarías a realizar un volcado de esas tablas con sus datos en un backup? De esa forma podríamos probar con el caso y las estructuras reales (y de paso no tener que volver a crear todo).
En principio, la idea de las dos subconsultas es crear tablas temporales que contengan los datos a listar. Entonces lo que debe ir con los alias "Categoria" y "Tipo", serían los campos que contengan los datos del tipo "Ciudad1" y "Hotel", tal que cada una de las tablas posea sólo lo que corresponda. Por allí hay que definir mejor esas subconsultas.

El problema base es que estás usando un sólo campo para contener dominios diferentes. No es lo mismo que pongas el nombre de una ciudad, que el tipo de residencia usado. En un correcto modelado, ambas cosas deberían estar en tablas diferentes, y estar unidas por una relación N:N, es decir, una tabla relacional.
En tu caso pareciera, a simple vista, que tratas de adaptar un modelo dado a una funcionalidad requerida. Mi duda es que no estoy seguro que eso sea posible con ese modelo.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #7 (permalink)  
Antiguo 26/10/2011, 09:30
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Unión de resultados... SELECT anidado o qué?

Cita:
El problema base es que estás usando un sólo campo para contener dominios diferentes. No es lo mismo que pongas el nombre de una ciudad, que el tipo de residencia usado. En un correcto modelado, ambas cosas deberían estar en tablas diferentes, y estar unidas por una relación N:N, es decir, una tabla relacional
Si, si. Seguro. Pero estoy usando wordpress y así está hecho

Cita:
En tu caso pareciera, a simple vista, que tratas de adaptar un modelo dado a una funcionalidad requerida. Mi duda es que no estoy seguro que eso sea posible con ese modelo.
Es que le estoy pidiendo peras al olmo, realmente. De hecho, wordpress no permite, nativamente y sin usar hooks o filtros, ordenar los "posts" por categoría (el nombre de la ciudad en mi caso). Ya encontré un filtro para poder hacerlo, pero me vi en la necesidad de hacer un doble ordenamiento y, como dije anteriormente, tanto las categorías (nativas de wordpress) como las taxonomías personalizadas (en mi caso el "tipo de alojamiento") se almacenan en el mismo lugar. Y ni hablar si además quisiera meter otro criterio más como por ejemplo las "comodidades" que ofrece (TV, Aire Acondicionado, etc): eso también es una custom taxonomy que se guarda en el mismo lugar que las categorías (y los tipos).

Así que, como estoy requiriendo algo que va más allá de las posibilidades de la plataforma, me parece mejor hacerlo de otra manera. Aunque repito: Si tenés ganas seguimos. No -me- viene mal como "cultura general".

Luego te paso a tu mail un dump de las tablas usadas.

Abrazo
__________________
...___...
  #8 (permalink)  
Antiguo 27/10/2011, 07:41
Avatar de AlZuwaga
Colaborador
 
Fecha de Ingreso: febrero-2001
Ubicación: 34.517 S, 58.500 O
Mensajes: 14.550
Antigüedad: 23 años, 9 meses
Puntos: 535
Respuesta: Unión de resultados... SELECT anidado o qué?

Hola de nuevo. Pasé la base de datos MySQL a MS Access y me puse a jugar un rato con las consultas. En cuestión de segundos llegué a este resultado que hace lo que pretendo:

Código MySQL:
Ver original
  1.       wp_posts.ID, wp_term_taxonomy.term_taxonomy_id, wp_term_taxonomy.taxonomy, wp_terms.name, wp_term_taxonomy_1.taxonomy, wp_terms_1.name
  2.     (((((wp_term_relationships INNER JOIN wp_term_taxonomy ON wp_term_relationships.term_taxonomy_id = wp_term_taxonomy.term_taxonomy_id)
  3.     INNER JOIN wp_terms ON wp_term_taxonomy.term_id = wp_terms.term_id)
  4.     INNER JOIN wp_posts ON wp_term_relationships.object_id = wp_posts.ID)
  5.     INNER JOIN wp_term_relationships AS wp_term_relationships_1 ON wp_posts.ID = wp_term_relationships_1.object_id)
  6.     INNER JOIN wp_term_taxonomy AS wp_term_taxonomy_1 ON wp_term_relationships_1.term_taxonomy_id = wp_term_taxonomy_1.term_taxonomy_id)
  7.     INNER JOIN wp_terms AS wp_terms_1 ON wp_term_taxonomy_1.term_id = wp_terms_1.term_id
  8.      (((wp_term_taxonomy.taxonomy)="category")
  9.      AND ((wp_term_taxonomy_1.taxonomy)="tipo")
  10.      AND ((wp_posts.post_status)="publish")
  11.      AND ((wp_posts.post_type)="alojamiento"))
  12.       wp_terms.name, wp_terms_1.name
  13. ;




Seguramente haya una manera mejor, pero funcionar funciona :)
__________________
...___...

Etiquetas: join, query, resultados, select, sql, anidados
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 02:40.