SQL: identificazione della tabella di origine dalla query UNION
Domanda
Sto creando un feed RSS in PHP che utilizza i dati di tre tabelle separate. Le tabelle si riferiscono tutte a pagine all'interno di diverse aree del sito. Il problema che ho sta provando a creare i campi di collegamento all'interno dell'XML. Senza sapere da quale tabella proviene ogni record, non riesco a creare il collegamento corretto ad esso.
C'è un modo per risolvere questo problema? Ho provato a utilizzare mysql_fetch_field, ma ha restituito valori vuoti per le tabelle.
$sql = "
SELECT Title FROM table1
UNION
SELECT Title FROM table2
UNION
SELECT Title FROM table3";
Ci sono altri campi coinvolti, ma questa è sostanzialmente la query che sto usando.
Qualsiasi aiuto sarebbe apprezzato.
Grazie.
Soluzione
Dovrebbe essere abbastanza facile, basta fare qualcosa del genere:
$sql = "
SELECT Title, 1 FROM table1
UNION ALL
SELECT Title, 2 FROM table2
UNION ALL
SELECT Title, 3 FROM table3";
Altri suggerimenti
Basta aggiungere una costante all'elenco delle colonne come segue:
select 'table1' as table_name, title from table1
union all
select 'table2' as table_name, title from table2
union all
select 'table3' as table_name, title from table3
che ti darà qualcosa del tipo:
table_name | title
-----------+-----------------------------
table1 | war and peace
table2 | 1984
table3 | terminator salvation
e così via.
Ciò ti consente di avere tipi di dati stringa che probabilmente renderanno più semplice la tua conversione in collegamenti (specialmente se usi valori che devono solo essere copiati nella tua pagina invece di essere cercati o convertiti) e usando come
ti consentirà di fare riferimento come qualsiasi altra colonna (per nome).
Nota l'uso di union all
- se sei sicuro che non ci saranno righe duplicate dalle tabelle (che è probabilmente vero in questo caso dato che hai un valore table_name
diverso per ciascuno e suppongo che i titoli siano univoci), l'unione tutto
può evitare un'operazione di smistamento e rimozione duplicati sprecata. L'uso di union
da solo può comportare l'esecuzione di lavori non necessari.
Se si desidera che venga eseguita la rimozione duplicata, tornare a utilizzare union
.
Aggiungi una colonna fittizia con un valore costante. Per esempio. " Seleziona 'funky_table' come source_table, titolo da funky_table " per ogni clausola ma con nomi diversi tra virgolette.
la query seguente funziona meglio e ti dà un'idea migliore poiché le query precedenti non eseguono il rendering delle righe due volte.
SELECT t1.*,t1.table_name
FROM
t1
UNION ALL
SELECT t2.*,t2.table_name
FROM
t2
LEFT OUTER JOIN
t1
ON t1.id=t2.id
WHERE t1.id=null
lo script sopra non fornisce righe di dati duplicati e assicurati
- Tutti i dati comuni tra t1 e t2 come tabella t1 di origine.
- Origine non t2 righe come tabella t1.
- Origine non t1 righe come tabella t2.
se vuoi dati comuni dalla tabella t2, capovolgi il join sinistro