2011-01-17 19 views
6

Mysql, używam SQL_CALC_FOUND_ROWS, aby uzyskać całkowitą liczbę możliwych rekordów.
Jak korzystać z UNION?
Jedyną rzeczą, która pracuje dla mnie teraz, co wydaje się nieco off jest:Jak zaimplementować SQL_CALC_FOUND_ROWS w zapytaniu z UNION?

SELECT COUNT(*) 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 

lub

SELECT SQL_CALC_FOUND_ROWS * 
FROM(SELECT * FROM t1 UNION SELECT * FROM t2) A; 
+0

co jest nie tak z Twoimi rozwiązaniami? –

Odpowiedz

16

Z FOUND_ROWS() documentation:

Zastosowanie SQL_CALC_FOUND_ROWS i FOUND_ROWS() jest bardziej złożone dla instrukcji UNION niż dla prostych instrukcji SELECT , ponieważ LIMIT może wystąpić w wielu miejscach w UNII. Może być zastosowany do indywidualnych instrukcji SELECT w UNION lub globalny do wyniku UNION jako całości.

Intencją SQL_CALC_FOUND_ROWS dla UNII jest, że powinien wrócić do wiersza liczyć, że będzie zwrócony bez globalny limit. Warunki użytkowania z SQL_CALC_FOUND_ROWS z Unią są:

  • Słowo kluczowe SQL_CALC_FOUND_ROWS musi pojawiają się w pierwszym SELECT Unii .

  • Wartość FOUND_ROWS() jest dokładna tylko w przypadku użycia UNION ALL. Jeśli UNION bez ALL jest używane, zduplikowane usunięcie występuje i wartość FOUND_ROWS() jest tylko przybliżona.

  • Jeżeli No Limit jest obecny w Unii, SQL_CALC_FOUND_ROWS jest ignorowany i Zwraca liczbę wierszy w tabeli tymczasowej że jest stworzony do procesie Unii.

+0

W celu wyjaśnienia, jest to 'SELECT SQL_CALC_FOUND_ROWS * FROM ((SELECT kolumny FROM t1) UNION ALL (WYBIERZ kolumny od t2)) _ut' * nie *' SELECT * FROM ((SELECT SQL_CALC_FOUND_ROWS kolumny FROM t1) UNION ALL (WYBIERZ kolumny FROM t2)) _ut' – mpen

2

Musisz podać SQL_CALC_FOUND_ROWS na pierwszym SELECT tylko w UNION; w rzeczywistości nie potrzebujesz zewnętrznego zapytania o numer SELECT, jak w przypadku korzystania z COUNT(*).

Tytułem przykładu, załóżmy, że mamy następującą kwerendę LIMIT ED:

SELECT * FROM my_table1 
UNION ALL 
SELECT * FROM my_table2 
UNION ALL 
SELECT * FROM my_table3 
LIMIT 0,10; 

Możemy po prostu napisać:

SELECT SQL_CALC_FOUND_ROWS * FROM my_table1 
UNION ALL 
SELECT * FROM my_table2 
UNION ALL 
SELECT * FROM my_table3 
LIMIT 0,10; 

Następnie rozmowy:

SELECT FOUND_ROWS(); 

ten unika pewnych narzutów związanych z zewnętrznym zapytaniem wymienionym w pytaniu oraz w komentarzach J. oe odpowiedź Stefelliego (choć nie jestem całkowicie przekonany, że byłaby zauważalna różnica).

myślę, że warto ponownie iteracji, że będzie działać tylko wtedy, gdy używasz UNION ALL zamiast UNION - To dlatego, że liczba wierszy jest obliczana przed duplikaty są usuwane, co oznacza, dostaniesz taki sam wynik z FOUND_ROWS() jak gdybyś użył UNION ALL.