2011-01-17 1 views
6

Mysql、SQL_CALC_FOUND_ROWSを使用して、可能なレコードの総数を取得しています。
UNIONでどのように使用しますか?
のみややオフになっているようだ今の私の作品の事、:FOUND_ROWS() documentationからUNIONでクエリにSQL_CALC_FOUND_ROWSを実装するにはどうすればよいですか?

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

または

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

解決策は何ですか? –

答えて

16

SQL_CALC_FOUND_ROWSとFOUND_ROWS の使用()はUNION 文の方が単純SELECT 文よりも複雑です。 LIMITは、UNIONの複数の場所で に発生することがあります。 UNION内の個々のSELECT ステートメントに適用される 、またはUNION結果全体として グローバルに適用される可能性があります。

UNIONのためのSQL_CALC_FOUND_ROWSの目的は、それが グローバルLIMITなしで返される行 数を返すべきであるということです。 UNIONとのSQL_CALC_FOUND_ROWSの使用 ための条件は以下のとおりです。

  • SQL_CALC_FOUND_ROWSキーワードが UNIONの最初のSELECTに表示されなければなりません。

  • UNION ALLが使用されている場合のみ、FOUND_ROWS()の値は正確に です。 ALLなしのUNION を使用すると、重複除外 が発生し、FOUND_ROWS()の値は に近似します。制限はUNION内に存在しない場合

  • は、 SQL_CALC_FOUND_ROWSは無視され、 は プロセスUNIONに作成され 一時テーブルの行数を返します。

+0

SELECT SELECT FROM(SELECT SQL_CALC_FOUND_ROWS * FROM t1)UNION ALL(SELECT列からFROM t2))_UT' * NOT * 'SELECT * FROM(SELECT SQL_CALC_FOUND_ROWS列からFROM t1) t2))_ut' – mpen

2

あなただけUNIONの最初のSELECTSQL_CALC_FOUND_ROWSを指定する必要があります。 COUNT(*)を使用しているときに実際に外側のSELECTクエリを実行する必要はありません。一例として

は、我々は以下のLIMIT編クエリを持っているとしましょう:

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

私たちは、単に書くことができます。

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

を私たちは、その後、呼び出し:

SELECT FOUND_ROWS(); 

このあなたの質問とJのコメントに外側のクエリが記載されているというオーバーヘッドを避けますoe Stefanelliの答え(私はそれが顕著な違いになると全面的には確信していませんが)。

私はそれはあなたがUNION ALLではなくUNIONを使用している場合は、このにのみ動作することを再反復する価値があると思う - 重複が削除される前に、行数は、あなたがFOUND_ROWS()から同じ結果を得ることができますつまり、計算されるためですUNION ALLを使用した場合のように

関連する問題