2011-09-13 14 views
18

Tengo una consulta de selección que selecciona archivos con un archivo en miniatura adjunto y también necesito obtener los que no tienen una miniatura adjunta.MySql SELECT unión para diferentes columnas?

Mi consulta SQL actual es

SELECT node.title, node.nid, files.fid, files.filepath, content_type_mobile_event.field_date_value, content_type_mobile_event.field_movie_shorts_value, content_type_mobile_event.field_director_value, content_type_mobile_event.field_length_value, content_type_mobile_event.field_movie_type_value, content_type_mobile_event.field_year_value, content_type_mobile_event.field_event_type_value, content_type_mobile_event.field_movie_location_value, content_type_mobile_event.field_movie_desc_value, content_type_mobile_event.field_movie_id_value, content_type_mobile_event.field_movie_thumb_fid, content_type_mobile_event.field_movie_trailer_url FROM node, content_type_mobile_event, files WHERE node.nid=content_type_mobile_event.nid AND content_type_mobile_event.field_movie_thumb_fid=files.fid ORDER BY content_type_mobile_event.field_date_value ASC 

Necesito también obtener

SELECT node.title, node.nid, content_type_mobile_event.field_date_value, content_type_mobile_event.field_movie_shorts_value, content_type_mobile_event.field_director_value, content_type_mobile_event.field_length_value, content_type_mobile_event.field_movie_type_value, content_type_mobile_event.field_year_value, content_type_mobile_event.field_event_type_value, content_type_mobile_event.field_movie_location_value, content_type_mobile_event.field_movie_desc_value, content_type_mobile_event.field_movie_id_value, content_type_mobile_event.field_movie_thumb_fid, content_type_mobile_event.field_movie_trailer_url FROM node, content_type_mobile_event WHERE node.nid=content_type_mobile_event.nid AND content_type_mobile_event.field_movie_thumb_fid!=1 ORDER BY content_type_mobile_event.field_date_value ASC 

Me normalmente sólo hacer una

(SELECT node.title, node.nid, files.fid, files.filepath, content_type_mobile_event.field_date_value, content_type_mobile_event.field_movie_shorts_value, content_type_mobile_event.field_director_value, content_type_mobile_event.field_length_value, content_type_mobile_event.field_movie_type_value, content_type_mobile_event.field_year_value, content_type_mobile_event.field_event_type_value, content_type_mobile_event.field_movie_location_value, content_type_mobile_event.field_movie_desc_value, content_type_mobile_event.field_movie_id_value, content_type_mobile_event.field_movie_thumb_fid, content_type_mobile_event.field_movie_trailer_url FROM node, content_type_mobile_event, files WHERE node.nid=content_type_mobile_event.nid AND content_type_mobile_event.field_movie_thumb_fid=files.fid ORDER BY content_type_mobile_event.field_date_value ASC) 
UNION 
(SELECT node.title, node.nid, content_type_mobile_event.field_date_value, content_type_mobile_event.field_movie_shorts_value, content_type_mobile_event.field_director_value, content_type_mobile_event.field_length_value, content_type_mobile_event.field_movie_type_value, content_type_mobile_event.field_year_value, content_type_mobile_event.field_event_type_value, content_type_mobile_event.field_movie_location_value, content_type_mobile_event.field_movie_desc_value, content_type_mobile_event.field_movie_id_value, content_type_mobile_event.field_movie_thumb_fid, content_type_mobile_event.field_movie_trailer_url FROM node, content_type_mobile_event WHERE node.nid=content_type_mobile_event.nid AND content_type_mobile_event.field_movie_thumb_fid!=1 ORDER BY content_type_mobile_event.field_date_value ASC) 

Pero el problema es que la segunda tiene una diferente conjunto de columnas (menos los archivos. * parte)

No puedo, por la vida de mí, descubrir cómo hacerlo.

+4

¿Sabía que está permitido utilizar saltos de línea, no es así? Y los alias también pueden ayudar. :) – GolezTrol

Respuesta

38

Si tiene campos diferentes que también tienen un significado diferente, no puede y no debe devolverlos en la misma posición. Sin embargo, puede 'llenar los espacios en blanco' mediante la adición nula a sus campos, así:

select id, name, date, null as userid, 'A' as recordtype from table1 
union all 
select id, name, null /*as date*/, userid, 'B' as recordtype from table2 

le puede proporcionar un alias para el nulo en la primera selección. Puede agregar alias en el segundo seleccionar para mayor claridad, pero no se usará. Incluso puede usar valores constantes que puede usar para distinguir el tipo de registro más tarde.

10

Si seleccione A no tiene una columna, basta con utilizar un valor nulo

table A (colA, ColB, ColC) 

table B (colA, ColD, ColE) 

select colA, ColB, ColC, null, null from table A 
union 
select colA, null, null, colD, colE from table B 

sólo tiene que asegurarse de que cada columna que está a juego son del mismo tipo de datos

+0

Gracias por señalar este método. Tengo un número igual de columnas para consultar para cada tabla, pero una columna en cada una tiene diferentes tipos de datos. Los nulos ayudaron a resolver esto y obtener los resultados que necesitaba. ¡Gracias! –

5

Puede falsa una columna para hacer la unión

por ejemplo.

select x, y from A 
    union 
    select z, null from B 
Cuestiones relacionadas