2011-01-17 12 views
6

Mysql, olası kayıtların toplam sayısını almak için SQL_CALC_FOUND_ROWS kullanıyorum.
Bunu UNION üzerinde nasıl kullanırım?
sadece biraz kapalı olduğu görünüyor şu anda benim için çalışıyor şey: FOUND_ROWS() documentation itibarenUNION ile bir sorguda SQL_CALC_FOUND_ROWS'yi nasıl uygularım?

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

veya

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

Çözümünüzün nesi yanlış? –

cevap

16

:

SQL_CALC_FOUND_ROWS ve FOUND_ROWS kullanımı() UNION deyimleri için basit SELECT deyimleri için daha karmaşık olduğundan daha karmaşıktır LIMIT, bir UNION içinde birden çok yerde oluşabilir. UNION'deki tek tek SELECT ifadelerine veya bir bütün olarak UNION sonucuna uygulanabilecek olabilir.

BİRLİĞİ için SQL_CALC_FOUND_ROWS amacı bir küresel LIMIT olmadan iade edileceği satır sayımı iade gerektiğidir. BİRLİĞİ ile SQL_CALC_FOUND_ROWS kullanımı koşulları şunlardır:

  • SQL_CALC_FOUND_ROWS kelime BİRLİĞİ ilk SELECT yer almalıdır.

  • FOUND_ROWS() değeri, UNION ALL kullanılıyorsa, tam olarak değeridir. UNION ALL olmadan kullanılırsa, duplicate removal kaldırılıyor ve FOUND_ROWS() değeri sadece yaklaşık değerdir.

  • hiçbir SINIR UNION varsa

    , SQL_CALC_FOUND_ROWS gözardı edilir ve süreç BİRLİĞİ için oluşturulan geçici tablodaki satırların döner sayısı.

  • Yalnızca UNION ilk SELECT üzerinde SQL_CALC_FOUND_ROWS belirtmelisiniz
+0

Sadece açıklığa kavuşturmak için, 'SELECT SQL_CALC_FOUND_ROWS * FROM ((SELECT sütunları t1) UNION TÜMÜ (TÜM sütunlar t2)) _ut' * not * 'SELECT * FROM ((SELECT SQL_CALC_FOUND_ROWS sütunları T1 FR1) UNION TÜMÜ (SELECT sütunları t2)) _ut' – mpen

2

; COUNT(*) kullanırken yaptığınız gibi bir dış SELECT sorgusuna ihtiyacınız yoktur.

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

Biz sadece yazabilirsiniz:

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

Sonra çağırır:

SELECT FOUND_ROWS(); 

Bu

Örnek olarak

, en aşağıdaki LIMIT ed sorgusu var diyelim Sorunuzda belirtilen dış sorguya sahip olmanın bazı yüklerini ve J'nin yorumlarını engeller. Stefanelli'nin cevabı (tamamen ikna olmamasına rağmen fark edilebilir bir fark olacaktır).

Ben yeniden yineleme sen UNION ALL kullanıyorsanız bu sadece ziyade UNION daha çalışacağını değer olduğunu düşünüyorum - Bu satır sayısı çiftleri kaldırılır önce hesaplandığı, çünkü sen FOUND_ROWS() aynı sonucu elde edersiniz anlam UNION ALL kullanıyor olsaydın.