2017-08-30 69 views
0

我想讓MySQL輸出表的COUNT和10個第一個結果。MySQL COUNT和列表10查詢

要列出表的10分第一的成績,我做這樣說:

SELECT * FROM SomeTable LIMIT 0,10 

這很簡單,它的工作原理相當不錯......但我還想指望我有多少項並將其附加到查詢中,以便我不需要執行2個查詢,浪費資源。

如果我做這種方式:

SELECT *, COUNT(*) FROM SomeTable LIMIT 0, 10 

它返回我一個錯誤,說:

[Err] 1140 - In aggregated query without GROUP BY, expression #1 of SELECT list contains nonaggregated column 'work.SomeTable.ID'; this is incompatible with sql_mode=only_full_group_by 

於是我決定使用GROUP BY,但同樣,它不返回我結果我想:

SELECT *, COUNT(*) FROM SomeTable GROUP BY SomeTable.ID LIMIT 0, 10 

返回我:

ID | Something1 | Something 2 | ... | COUNT(*) 
1  Lorem   Ipsum  ...  1 
2  Lorem   Ipsum  ...  1 
3  Lorem   Ipsum  ...  1 
...  ...   ...  ...  ... 
10  Lorem   Ipsum  ...  1 

最後,我想這樣說:

SELECT *, (SELECT COUNT(*) FROM SomeTable) FROM SomeTable GROUP BY SomeTable.ID LIMIT 0, 10 

將返回:

ID | Something1 | Something2 | ... | COUNT(*) 
1  Lorem   Ipsum  ...  13 
2  Lorem   Ipsum  ...  13 
3  Lorem   Ipsum  ...  13 
...  ...   ...  ...  ... 
10  Lorem   Ipsum  ...  13 

13表的大小,這是很好的,但重複這對於每個條目是有點浪費資源...

我的目標是讓它像這樣輸出:

ID | Something1 | Something2 | ... 
1  Lorem   Ipsum  ... 
2  Lorem   Ipsum  ... 
3  Lorem   Ipsum  ... 
...  ...   ...  ... 
10  Lorem   Ipsum  ... 
------------------------------------- 
COUNT(*) | 
    13 

我很無能。任何幫助是極大的讚賞。

+0

你的計數是基於什麼? – Hackerman

+0

@Hackerman字面上「*」,因爲我只想計算條目,而不是一個特定的項目。 – Fusseldieb

+0

這是不是你可以和應該從你的PHP表示層處理?在PHP中,您可以控制要顯示的內容,並且結果集的大小也會產生計數。 –

回答

3

您不能在MySQL或任何其他RDMS中的一個結果集中返回兩個不同的「行類型」行。

它們必須是兩個不同的查詢,或者你可以做你已經找到的。

您似乎想要總表大小,並結合前10個結果。這通常是通過兩個查詢完成的,其中一個是SELECT COUNT(*) FROM table,另一個是您想要返回的集合。不要害怕撥打COUNT(*),因爲SQL引擎會跟蹤表中的全部記錄,所以通常這不會執行完整的表掃描。

+0

謝謝,我會用2個查詢來完成。我只問,因爲對我來說,它正在嗅到「不良編程實踐」分別調用多個SQL請求,可能會浪費毫秒或幾秒的處理時間。 – Fusseldieb

3

你不想COUNT(),你想SQL_CALC_FOUND_ROWS

SELECT SQL_CALC_FOUND_ROWS SomeTable.* FROM SomeTable LIMIT 0,10 

該查詢後,您可以進行單獨的查詢來獲取總的行數:

SELECT FOUND_ROWS() 

按照使用說明書:

第二個SELECT返回一個數字,表示第一個有多少行 如果沒有LIMIT 子句,SELECT將返回。

和:

然而,這是不是再次運行查詢無極限, 因爲結果集不需要被髮送到客戶端更快。

+0

他說他希望'COUNT(*)'(如所有記錄),但您的解決方案更好,因爲它在過濾時不會中斷。 –

+0

@BartFriederichs我不確定你的意思,這會得到沒有限制的同一個查詢的所有記錄。或者我誤解了你的評論? – jeroen

+0

OP聲明他需要表中所有記錄的計數,所以如果不進行過濾,'SELECT COUNT(*)FROM table'將返回與'SELECT FOUND_ROWS()'相同的值。 –