0

我发现很难确定什么是从由 where 语句过滤的表中计算某些特定记录的最快方法是我的代码,以下是查询:

$type_mo3ln_malk = mysql_num_rows(mysql_query("SELECT * FROM `tableshow` $weress AND mo3ln_type='malk'"));
$type_mo3ln_mswg = mysql_num_rows(mysql_query("SELECT * FROM `tableshow` $weress AND mo3ln_type='mswg'"));
$type_mo3ln_mktb = mysql_num_rows(mysql_query("SELECT * FROM `tableshow` $weress AND mo3ln_type='mktb'"));
$type_mo3ln_wkeel = mysql_num_rows(mysql_query("SELECT * FROM `tableshow` $weress AND mo3ln_type='wkeel'"));
$type_mo3ln_no = mysql_num_rows(mysql_query("SELECT * FROM `tableshow` $weress AND mo3ln_type='0'"));

进行计数的函数是在 php 中预定义的函数

我正在考虑使用 count() 函数,但我想知道是否可以将 Sum 函数仅用于某些特定行,正如 Mr.Hates 在此处建议的那样 Get record counts for all tables in MySQL database

4

5 回答 5

5
SELECT COUNT(*) FROM `table` WHERE `whatever`='whatever';

将返回一行(而不是超过 9000 行),其中包含基于您设置的规则的正确计数。

于 2012-07-28T22:24:42.027 回答
1

这应该更快:

SELECT COUNT(CASE mo3ln_type WHEN 'malk'  THEN 1 END) AS cnt_mo3ln_malk,
       COUNT(CASE mo3ln_type WHEN 'mswg'  THEN 1 END) AS cnt_mo3ln_mswg,
       COUNT(CASE mo3ln_type WHEN 'mktb'  THEN 1 END) AS cnt_mo3ln_mktb,
       COUNT(CASE mo3ln_type WHEN 'wkeel' THEN 1 END) AS cnt_mo3ln_wkeel,
       COUNT(CASE mo3ln_type WHEN '0'     THEN 1 END) AS cnt_mo3ln_no
FROM   tableshow
WHERE  mo3ln_type IN ('malk', 'mswg', 'mktb', 'wkeel', '0')

SELECT这将在一个单独的语句中而不是五个单独的语句中获得所有计数。

mo3ln_type如果您在列上设置了索引,则该WHERE子句应该会很快缩小您的行,然后只需有条件地在COUNT().

如果将每个都表示mo3ln_type为整数而不是字符串,则速度会更快,因为对数字的比较要快得多。也许您可以创建另一个表来存储不同的mo3ln_types和在tableshow表中,只是有一个对 INT 主键的外键引用,mo3ln_types而不是实际的文本字符串。(例如WHERE mo3ln_type_id IN (1, 2, ...),而不是WHERE mo3ln_type IN 'malk', 'mswg', ...).

于 2012-07-28T22:44:51.890 回答
1

您可以使用count(*)

SELECT COUNT(*) FROM <table_name> WHERE <where_clause>;

或者(例如,如果您进行分页)使用SQL_CALC_FOUND_ROWS,如果您还想进行查询:

SELECT SQL_CALC_FOUND_ROWS * FROM <table_name> WHERE <clause> LIMIT 0, 10;
SELECT FOUND_ROWS();

更多信息:MySql 信息函数 -> FOUND_ROWS()

如果您只想获取计数,请使用 SUM 函数:

SELECT SUM(CASE WHEN mo3ln_type = 'malk'  THEN 1 ELSE 0 END) AS malk,
       SUM(CASE WHEN mo3ln_type = 'mswg'  THEN 1 ELSE 0 END) AS mswg,
       SUM(CASE WHEN mo3ln_type = 'mktb'  THEN 1 ELSE 0 END) AS mktb,
       SUM(CASE WHEN mo3ln_type = 'wkeel' THEN 1 ELSE 0 END) AS wkeel,
       SUM(CASE WHEN mo3ln_type = '0'     THEN 1 ELSE 0 END) AS no_type
FROM   tableshow
WHERE  <where_clausw>

更多信息:MySql 控制流函数 -> CASE 运算符,MySql 聚合函数 -> SUM 函数 *

  • dev.mysql.com/doc/refman/5.0/en/group-by-functions.html#function_sum
于 2012-07-28T22:47:56.553 回答
0

数据库的执行工作总是比应用程序层快得多,因此使用Count(*)命令从数据库返回计数效率更高。

于 2012-07-28T22:30:16.320 回答
0

要求数据库计算行数,而不是 PHP。在 SQL 语句中使用 COUNT(*)。

function f_count_rows($table, $where='') {
  $result = mysql_query("SELECT COUNT(*) AS nbr FROM `".$table."` ".$where);
  $row = mysql_fetch_assoc($result);
  return $row['nbr'];
}

$type_mo3ln_malk  = f_count_rows("tableshow", $weress." AND mo3ln_type='malk'");
$type_mo3ln_mswg  = f_count_rows("tableshow", $weress." AND mo3ln_type='mswg'");
$type_mo3ln_mktb  = f_count_rows("tableshow", $weress." AND mo3ln_type='mktb'");
$type_mo3ln_wkeel = f_count_rows("tableshow", $weress." AND mo3ln_type='wkeel'");
$type_mo3ln_no    = f_count_rows("tableshow", $weress." AND mo3ln_type='0'");
于 2012-07-28T22:31:32.183 回答