簡體   English   中英

MySql 選擇行數作為額外的列?

[英]MySql selecting count of rows as extra column?

我需要一個 MySql 語句來選擇所有行,以及總共有多少行。

我正在使用

mysql_query("SELECT * FROM posts LIMIT 0, 5");

...試圖添加計數:

mysql_query("SELECT *, COUNT(*) AS total FROM posts LIMIT 0, 5");

...但這僅返回一行。

另外,如果有更好的方法來獲得總數而不是在每行中添加一個額外的列,那么我想要那個。 謝謝!

-- 請參閱下面@Ittai 的評論。 提議的解決方案依賴於已棄用的功能——https: //dev.mysql.com/worklog/task/? id =12615

我需要一個 MySql 語句來選擇所有行,以及總共有多少行。

從字面上看,這是不可能的。 SQL 查詢的結果是一個(虛擬)表; 該結果表中每一行中的列提供一個僅與該行相關聯的值,並且這些行實際上彼此獨立。

有很多方法可以獲取整個結果的行數,但它要么在兩個語句中完成,要么使用在概念上與您所擁有的查詢不同的查詢完成。 (以下解決方案)

您的原始問題中有一個方面可以用多種方式解釋:

以及總共有多少行

這可能意味着:

  1. 計算結果中返回的每一行。
  2. 如果不是 LIMIT 子句(在這種情況下將結果截斷為 5 行),則計算將返回的每一行

(我會在下面給出兩個答案)

但這僅返回一行。 我猜這是因為 COUNT(*) 對每一行都是相同的,並且出於某種原因,MySql 只返回具有唯一值的行? 我沒有線索。

COUNT是一個聚合函數。 通過使用聚合函數,您要求數據庫將多組行組合在一起,並將其某些方面投影到一行中。 令人困惑的是,mysql 還可以在同一個SELECT列表中混合非聚合和聚合表達式。 大多數其他數據庫不允許這樣做,並為此給您一個錯誤,但可惜 MySQL 不允許。

但是 COUNT(*) 仍然將所有行聚合成一行,代表整個行組。

另外,如果有更好的方法來獲得總數而不是在每行中添加一個額外的列,那么我想要那個。 謝謝!

是的,有幾種方法。

如果你想得到返回給 PHP 的行數,那么,在 MySQL 應用它的限制子句之后,我建議簡單地調用 php 函數mysql_num_rows ( http://www.php.net/manual/en/function.mysql-num -rows.php ) 在執行mysql_query調用之后。

如果您想獲取在沒有LIMIT子句的情況下返回的行數,我建議分兩步完成:首先,執行原始查詢的略微修改版本,然后立即調用 MySQL 的FOUND_ROWS函數。 (見http://dev.mysql.com/doc/refman/5.5/en/information-functions.html#function_found-rows

它看起來像這樣:

$result = mysql_query('SELECT SQL_CALC_FOUND_ROWS * FROM posts LIMIT 0, 5');
//do stuff with the result, but don't do any other queries

//get the total number of rows (disregarding the LIMIT clause) 
$result = mysql_query('SELECT FOUND_ROWS()');

SQL_CALC_FOUND_ROWS修飾符告訴 MySQL 在應用LIMIT子句之前跟蹤總行數,並且FOUND_ROWS()返回該數字。 請記住 2 件事:

  1. 這兩個mysql_query調用都應該在同一個連接上執行
  2. 不要在對mysql_query這些調用之間執行另一個查詢

哦,最后一點:使用LIMIT ,您通常希望以特定方式對結果進行排序。 通常人們使用LIMIT進行分頁。 如果您不對行進行排序,則順序是不確定的,后續查詢可能會返回先前語句已返回的行,即使LIMIT偏移量不同。 您可以使用ORDER BY子句對結果進行顯式排序。 ( http://dev.mysql.com/doc/refman/5.5/en/select.html )

我不確定您在想哪個總數:當前選擇的總數或整個表中所有行的數量。 這將返回整個表中所有行的編號,當然在每一行中都具有相同的值:

mysql_query("SELECT *, (select COUNT(*) from posts) AS total FROM posts LIMIT 0, 5");

我認為你把這個問題復雜化了。 我認為使用兩個查詢沒有問題。

第一個查詢以獲取總帖子數(我假設您想要整個表中的總數):

SELECT COUNT(*) AS total FROM posts;

其次,查詢您的帖子:

SELECT * FROM posts LIMIT 0, 5

原因是使用多個查詢檢索數據並不總是一件壞事,尤其是在有意義的情況下。

如果您要使用子查詢將其添加為附加列,則每行中都會有總數,但您基本上仍然會運行兩個查詢(或者子查詢是否會為每一行運行,我不記得了?)

它還為首先獲取計數提供了更大的靈活性,因為某些查詢將根據查詢的復雜程度返回錯誤的總計數。 您可能需要修改計數查詢,以便獲得正確的總數並可以正確分頁。

例如,在一對多查詢的情況下,假設您想要獲取帖子和評論,您會得到錯誤的計數,因為該帖子的每個評論都會重復該帖子。

縮寫示例:

post_id | comment_id
1       | 1
1       | 2
2       | 3
3       | 4
3       | 5

因此,要正確執行此操作,您首先需要運行以下查詢以獲取總帖子數:

SELECT COUNT(*) AS total FROM posts;

然后你需要運行:

SELECT id FROM posts limit 0, 5;

最后你會運行:

select p.id, c.id from posts p left join comments c on c.post_id = p.id where id in(id list from above query)

顯然您的查詢不會遇到上述問題。 但我只是想說明為什么在單獨的查詢中獲取總數可能會很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM