2011-09-13 18 views
18

Ho una query di selezione che seleziona i file con un file di anteprima allegato e ho anche bisogno di ottenere quelli senza miniatura in allegato.Unione MySql SELECT per colonne diverse?

mia query SQL corrente è

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 

ho bisogno di ottenere anche

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 

mi sarebbe normalmente solo fare un

(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) 

Ma il problema è la seconda ha un diverso set di colonne (meno i file. * parte)

Non riesco, per la vita di me, a capire come farlo.

+4

Sai che sei autorizzato a utilizzare interruzioni di riga, non sei tu? E anche gli alias possono aiutare. :) – GolezTrol

risposta

38

Se si dispone di campi diversi che hanno anche un significato diverso, non è possibile e non devono restituirli nella stessa posizione. È possibile tuttavia 'riempire gli spazi vuoti' con l'aggiunta di null per i campi, in questo modo:

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 

è possibile fornire un alias per il nulla nel primo select. È possibile aggiungere alias nella seconda selezione per maggiore chiarezza, ma non verrà utilizzato. È anche possibile utilizzare valori costanti che è possibile utilizzare per distinguere il tipo di record in un secondo momento.

10

se si seleziona il non dispone di una colonna, è sufficiente utilizzare un valore nullo

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 

solo bisogno di essere sicuri che ogni colonna che si sono corrispondenti sono dello stesso tipo di dati

+0

Grazie per aver segnalato questo metodo. Ho un numero uguale di colonne da interrogare per ogni tabella, ma una colonna in ciascuna ha diversi tipi di dati. I null hanno aiutato a risolvere questo problema e ottenere i risultati di cui avevo bisogno. Grazie! –

5

È possibile falso una colonna per fare unione

es.

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