2010-10-24 19 views
12

Diciamo che voglio eseguire questa query:UNION ALL e LIMIT in MySQL

(SELECT a FROM t1 WHERE a=10 AND B=1) 
UNION ALL 
(SELECT a FROM t2 WHERE a=11 AND B=2) 
UNION ALL 
(SELECT a FROM t3 WHERE a=12 AND B=3) 
ORDER BY a LIMIT 1000; 

è MySQL abbastanza intelligente per saltare "t3", se 550 risultati sono disponibili in "T1" e 450 in "T2"?

Sto guardando i documenti MySQL (http://dev.mysql.com/doc/refman/5.1/en/union.html) ma non riesco a trovare la risposta.

risposta

5

Come specificato nella descrizione UNION Sintassi (http://dev.mysql.com/doc/refman/5.1/en/union.html):

Il comportamento predefinito per nell'Unione è che righe duplicate vengono rimossi dal risultato . La parola chiave DISTINCT opzionale non ha alcun effetto oltre al valore predefinito perché specifica anche la rimozione della riga duplicata . Con la parola chiave ALL opzionale, la rimozione della riga duplicata non si verifica e il risultato include tutte le righe corrispondenti di tutte le istruzioni SELECT.

Suppongo, questa è la risposta alla tua domanda.

+0

capito, grazie per la risposta – Fretre

+0

Nel risultato impostato, i dati da t1 saranno sempre prima di t2 e t3 e t2 prima di t3? Devo leggere i dati ordinati da "B ASC" e chiedermi se posso saltare "l'ordine di B ASC" seguendo i sindacati. – Fretre

+0

È specificato nel manuale, "UNION di default produce un insieme non ordinato di righe", quindi, per quanto ho capito, non c'è garanzia. – Kel

0

Funziona per me sto usando MySQL.

ma assicurarsi che il numero limite è sempre lo stesso per tutti

in quell'esempio che si ottiene 3 risultati da ogni tavolo

(SELECT a FROM t1 WHERE a=10 AND B=1 LIMIT 9) 
UNION ALL 
(SELECT a FROM t2 WHERE a=11 AND B=2 LIMIT 9) 
UNION ALL 
(SELECT a FROM t3 WHERE a=12 AND B=3 LIMIT 9) 
+0

Questo non è giusto in quanto restituirà massimo 27 righe. – brooNo