2010-05-20 83 views
4

我不確定這是否是一個好問題。每行添加count()列

我有一個複雜的查詢與很多的工會,搜索多個表的某個關鍵字(用戶輸入)。所有搜索到的表都與表book有關。

使用LIMIT對結果集進行分頁,因此最多總共有10個結果被撤銷。

我想在結果集中顯示額外的列,但顯示找到的結果總量。 我不想使用單獨的查詢來做到這一點。是否有可能將count()列添加到結果集中,以計算找到的每個結果?

輸出應該是這樣的:

ID Title Author Count(...) 
1  book_1 auth_1  23 
2  book_2 auth_2  23 
4  book_4 auth_..  23 

...

謝謝!

+1

這有什麼錯用一個單獨的查詢?在結果集的每一行中添加具有相同值的列相當難看。也許你可以把count作爲單個請求的一部分(儘管是一個不同的查詢)。 – 2010-05-20 11:22:27

+1

好吧,我不得不使用幾乎相同的查詢(而不是選擇值我會做count(...))但是,查詢是複雜的,它是包含內部連接的幾個查詢的聯合。查詢需要大約1秒鐘的時間來執行,我只是覺得2秒太多了...... – Nathan 2010-05-20 12:50:21

+0

請輸入密碼。你現在的查詢是什麼樣的? – 2010-05-20 13:00:23

回答

4

這不會將計數添加到每行,但獲得總計數而不運行第二個查詢的一種方法是使用SQL_CALC_FOUND_ROWS選項運行第一個查詢,然後選擇FOUND_ROWS()。如果你想知道總共有多少結果,那麼你可以計算頁數。

例子:

select SQL_CALC_FOUND_ROWS ID, Title, Author 
from yourtable 
limit 0, 10; 
SELECT FOUND_ROWS(); 

從手冊: http://dev.mysql.com/doc/refman/5.1/en/information-functions.html#function_found-rows

+0

這實際上做的竅門,謝謝! – Nathan 2010-05-22 08:17:05

4

在查詢計數的通常的方法是所返回的字段組:

select ID, Title, Author, count(*) as Cnt 
from ... 
group by ID, Title, Author 
order by Title 
limit 1, 10 

所述CNT列將包含各組,即對於每個標題中記錄的數量。

+0

<撤回的評論> – 2010-05-20 11:30:47

+0

是真的,但沒有什麼'分組',我需要計算的總行數,而不僅僅是組的行... – Nathan 2010-05-20 12:48:45

+2

@Arsenal:我明白了......如果你想返回一個計數以及你計算的數據,那麼你需要一個單獨的查詢。您可以將其作爲子查詢或加入,以相同的結果返回它,但是沒有辦法繞過它。 – Guffa 2010-05-20 17:26:05

-4

你根本無法做到這一點,你將不得不使用第二個查詢。

+0

好吧,我擔心這會是這種情況... – Nathan 2010-05-20 12:52:48

5

關於第二個查詢:

select tbl.id, tbl.title, tbl.author, x.cnt 
from tbl 
cross join (select count(*) as cnt from tbl) as x 

如果你不會加入到其他表(S):

select tbl.id, tbl.title, tbl.author, x.cnt 
from tbl, (select count(*) as cnt from tbl) as x 
+0

這增加了所有的計數記錄到每一行,而不是每個組的計數 – user2378769 2016-05-12 22:42:50

+0

@ user2378769檢查問題 – 2016-05-13 08:28:33

0

如果你的問題是簡單地做第二(複雜)的速度/成本查詢我建議你簡單地選擇結果集到一個散列表中,然後在返回時從那裏計算行數,或者甚至更有效地使用先前結果集的rowcount,那麼你甚至不需要重新計算

1

我的解決方案:

SELECT COUNT(1) over(partition BY text) totalRecordNumber 
    FROM (SELECT 'a' text, id_consult_req 
      FROM consult_req cr);