2010-11-20 19 views

risposta

15

Il modo migliore è creare una nuova tabella contenente i campi comuni delle altre tre tabelle e aggiungere un indice nel campo della data comune. Le tre tabelle originali dovrebbero contenere una chiave esterna che collega alla tabella comune. Con questo progetto la query diventa semplice:

SELECT * 
FROM common_table 
ORDER BY "date" DESC 
LIMIT 100 

Se hai bisogno anche i dati dalle tabelle più specifici è possibile utilizzare LEFT JOIN per selezionare, inoltre, che i dati nella stessa query.

Se non è possibile cambiare il tuo design e le prestazioni non è un problema, è possibile utilizzare UNION ALL per combinare i risultati di tutti e tre tavoli prima della cernita:

SELECT * FROM table1 
UNION ALL 
SELECT * FROM table2 
UNION ALL 
SELECT * FROM table3 
ORDER BY "date" DESC 
LIMIT 100 

Si noti che quanto sopra funziona solo se tutte le tabelle hanno la stessa struttura. Se hai campi che si verificano in una tabella ma non in altri, dovresti ometterli da SELECT o altrimenti restituire NULL per quella colonna nelle altre tabelle. Per esempio se:

  • table1 ha colonne a, b, c e date.
  • table2 ha colonne b, c e date.
  • table3 ha colonne a, c e date.

Quindi utilizzare questo:

SELECT a, b, c, "date" 
FROM table1 
UNION ALL 
SELECT NULL AS a, b, c, "date" 
FROM table2 
UNION ALL 
SELECT a, NULL as b, c, "date" 
FROM table3 
ORDER BY "date" DESC 
LIMIT 100 
+3

E per quanto riguarda le prestazioni, se tre tabelle hanno molti record? – vietean

9
SELECT..... 
UNION ALL 
SELECT.... 
UNION ALL 
SELECT ... 
ORDER BY date_field; 

Per le migliori prestazioni, si applicano ORDER BY/LIMIT il più tardi possibile, ed evitare in sottoquery.

Problemi correlati