2011-01-17 15 views
6

Mysql, sto usando SQL_CALC_FOUND_ROWS per ottenere il numero totale di record possibili.
Come si usa su UNION?
L'unica cosa che funziona per me in questo momento, che sembra un po 'fuori a dire:Come implementare SQL_CALC_FOUND_ROWS su una query con UNION?

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

o

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

cosa c'è di sbagliato con le vostre soluzioni? –

risposta

16

Dal FOUND_ROWS() documentation:

L'uso di SQL_CALC_FOUND_ROWS e FOUND_ROWS() è più complesso per le istruzioni UNION rispetto alle semplici istruzioni SELECT , perché LIMIT si può verificare a più posti in un UNION. Può essere applicato a singole istruzioni SELECT nell'UNION o globale a il risultato UNION nel suo complesso.

L'intento di SQL_CALC_FOUND_ROWS per UNION è che dovrebbe restituire la riga conteggio che verrebbe restituito senza un limite globale . Le condizioni per l'uso di SQL_CALC_FOUND_ROWS con UNION sono:

  • La parola chiave deve SQL_CALC_FOUND_ROWS apparire nella prima SELECT della UNION.

  • Il valore di FOUND_ROWS() è esatto solo se UNION ALL viene utilizzato. Se si utilizza UNION senza TUTTO, si verifica la duplicazione della rimozione e il valore di FOUND_ROWS() è solo approssimativo.

  • Se nessun limite è presente nel UNION, SQL_CALC_FOUND_ROWS viene ignorato e restituisce il numero di righe della tabella temporanea che è stato creato per processo UNION.

+0

Giusto per chiarire, è 'SELECT SQL_CALC_FOUND_ROWS * FROM ((SELECT colonne FROM t1) UNION ALL (SELECT colonne FROM t2)) _ut' * not *' SELECT * FROM ((SELECT SQL_CALC_FOUND_ROWS colonne FROM t1) UNION ALL (SELECT colonne FROM t2)) _ut' – mpen

2

È necessario specificare SQL_CALC_FOUND_ROWS al primo SELECT solo nel UNION; non hai effettivamente bisogno di una query esterna SELECT come quando usi COUNT(*).

A titolo di esempio, diciamo che abbiamo la seguente query LIMIT ndr:

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

possiamo semplicemente scrivere:

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

Abbiamo poi chiamano:

SELECT FOUND_ROWS(); 

Questo evita un sovraccarico di avere la query esterna menzionata nella tua domanda e nei commenti di J oe la risposta di Stefanelli (anche se non sono del tutto convinto che sarebbe una differenza evidente).

penso che sia rimarcato che questo funziona solo se si utilizza UNION ALL piuttosto che UNION - Questo è perché il conteggio delle righe viene calcolato prima di duplicati vengono rimossi, il che significa che si otterrà lo stesso risultato da FOUND_ROWS() come faresti se avessi usato UNION ALL.