2013-07-25 6 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 

Теперь ясно, результат ограничен первым дополнительный WHERE и, наконец, LIMIT.

Как я могу получить количество строк, возвращаемых подзапросом, без необходимости выполнять его отдельно?

+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

Что такое 'cross join'? –

+0

@Cobra_Fast. , , Кросс-соединение используется для определения начального значения переменной '@ rn'. –

+0

Получил это, и он работает, хотя общее утверждение теперь в 10-20 раз медленнее ... Есть ли способ ускорить это? –