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() 関数を使用することを考えていますが、Mr.Hates がここで提案したように、特定の行にのみ Sum 関数を使用できるかどうか疑問に思ってい ます MySQL データベースのすべてのテーブルのレコード数を取得する

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これにより、5 つの個別のステートメントではなく、1 つのステートメントですべてのカウントが取得されます。

mo3ln_type列にインデックスが設定されている場合、WHERE句は行をかなり迅速に絞り込む必要があります。その後、それらの行を条件付きでCOUNT().

mo3ln_type数値の比較ははるかに高速であるため、それぞれを文字列ではなく整数として表すと、さらに高速になります。おそらく、実際のテキスト文字列の代わりにINT 主キーへの外部キー参照を持つだけmo3ln_typesで、テーブルに別の and を格納する別のテーブルを作成できます。(例:の代わりに.tableshowmo3ln_typesWHERE 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 に答える