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.

È stato utile?

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

  1. Tutti i dati comuni tra t1 e t2 come tabella t1 di origine.
  2. Origine non t2 righe come tabella t1.
  3. Origine non t1 righe come tabella t2.

se vuoi dati comuni dalla tabella t2, capovolgi il join sinistro

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top