2013-07-25 86 views
0

我有這樣從子查詢中獲取總行數?

SELECT row1, row2 
FROM (
    SELECT b.row21, COUNT(b.row21) AS hits 
    FROM table2 AS b 
    WHERE b.row22 = 'foo' OR b.row22 = 'bar' 
    GROUP BY b.row21 
    HAVING hits = 2 
) AS b 
INNER JOIN table1 AS a ON (b.row21 = a.row1) 
WHERE row2 = 123 
LIMIT 10 

現在清楚了,結果首先由LIMIT額外WHERE,最終限制的查詢。

那麼如何檢索子查詢返回的行數量,而無需單獨執行?

+0

你應該問你自己應該如何顯示它?我的意思是子查詢計數將分組函數和row1,row2是單個函數。從邏輯上講,你期望它在哪裏顯示? – 7alhashmi

+0

@ 7alhashmi我在網站上顯示結果。所以我希望在通過LIMIT提供頁面的同時計算總體結果。 –

回答

1

你可以在MySQL中使用變量做到這一點:

SELECT row1, row2, @rn as numrows 
FROM (
    SELECT b.row21, COUNT(b.row21) AS hits, @rn := @rn + 1 
    FROM table2 b cross join 
     (select @rn := 0) const 
    WHERE b.row22 = 'foo' OR b.row22 = 'bar' 
    GROUP BY b.row21 
    HAVING hits = 2 
) AS b 
INNER JOIN table1 AS a ON (b.row21 = a.row1) 
WHERE row2 = 123 
LIMIT 10; 

你所冒的風險是,MySQL 可以改寫在一個非常不同的方式查詢,這可能避免某些行的產生。一些SQL編譯器足夠聰明來做到這一點。我不認爲MySQL很聰明。

+0

什麼是交叉連接? –

+0

@Cobra_Fast。 。 。交叉連接用於定義變量「@ rn」的初始值。 –

+0

明白了,它的工作原理,雖然總體陳述現在慢了10到20倍......有什麼辦法可以加快速度? –