2010-11-20 9 views

Odpowiedz

15

Najlepszym sposobem jest utworzenie nowej tabeli zawierającej wspólne pola z trzech pozostałych tabel i dodanie indeksu do wspólnego pola daty. Oryginalne trzy tabele powinny zawierać klucz obcy powiązany ze wspólną tabelą. Z tym wzorem kwerenda staje się prosta:

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

Jeśli trzeba także dane z bardziej szczegółowych tabel można użyć LEFT JOIN również zaznaczyć, że dane w tym samym zapytaniu.

Jeśli nie mogą zmienić swój wygląd i wydajność nie jest problemem, a następnie można użyć UNION ALL, aby połączyć wyniki ze wszystkich trzech tabel przed sortowaniem:

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

Należy zauważyć, że powyższe będzie działać tylko wtedy, wszystkie stoły mają taką samą strukturę. Jeśli masz pola, które występują w jednej tabeli, ale nie w innych, to powinieneś pominąć je w SELECT lub zwrócić NULL dla tej kolumny w innych tabelach. Na przykład, jeżeli:

  • table1 ma kolumn a, b, c i date.
  • table2 ma kolumny b, c i date.
  • table3 ma kolumny a, c i date.

Następnie użyj tego:

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

Co powiesz na wydajność, jeśli trzy stoły mają wiele rekordów? – vietean

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

Aby uzyskać najlepszą wydajność, stosuje BY/limit tak późno, jak to możliwe, unikać go w podzapytania.

Powiązane problemy