0

次の SQL に問題があります。

$sql = mysql_query("SELECT $menucompare ,
  (COUNT($menucompare ) * 100 / (SELECT COUNT( $menucompare )
  FROM data WHERE $ww = $button ))  AS percentday FROM data WHERE $ww >0  ");
  • $menucompareテーブルのフィールド名は、フィールドが選択されたものであり、以下のデータを含みます
  • $button選択された週番号です(週「6」としましょう)
  • $ww週数が '6' の行を持つテーブル フィールド名

たとえば、次の$menucompareようなデータがあります。

123456bool
521478bool
122555heel
147788itoo

そして、データの最後に同じ単語が含まれている人を選択して、パーセンテージを作成したいと思います。

出力は次のようになります。

  • ブール -- 50% (2 エントリ)
  • ヒール -- 25% (1 エントリ)
  • itoo -- 25% (1 エントリ)

私のSQLに対する明確さは非常に高く評価されます。そのようなものは周りに見つかりませんでした。

4

2 に答える 2

3

データをそのような形式で保持することはおそらく最善の方法ではありません。可能であれば、フィールドを 2 つの別々のフィールドに分割してください。

まず、フィールドの末尾から文字列部分を抽出する必要があります。

  • 文字列/数値部分の長さが固定されている場合、それは非常に簡単です。
  • そうでない場合は、正規表現を使用する必要がありますが、残念ながら、MySQL にはデフォルトで存在しません。解決策があります。次の質問を確認してください: MySQL で正規表現を置き換えるにはどうすればよいですか?

数値部分が固定されていると仮定します:

SELECT s.str, CAST(count(s.str) AS decimal) / t.cnt * 100 AS pct
  FROM (SELECT substr(entry, 7) AS str FROM data) AS s
  JOIN (SELECT count(*) AS cnt FROM data) AS t ON 1=1
 GROUP BY s.str, t.cnt;

regexp_replace機能がある場合は、必要な結果を得るためにsubstr(entry, 7)に置き換える必要があります。regexp_replace(entry, '^[0-9]*', '')

バリアントはここsubstrでテストできます。

于 2012-05-12T20:44:03.980 に答える
2

このような問題を整理するときは、次の 2 つの手順で行います。

  1. プレゼンテーション言語 (PHP?) とは独立して SQL を整理します。
  2. 正しいクエリを取得したことがわかったら、クエリのパラメーター化と結果の表示を整理します。

この質問には「SQL」というタグが付けられているため、最初の質問のみを扱います。

最初のステップは、クエリを整理することです。

SELECT menucompare,
       (COUNT(menucompare) * 100 / (SELECT COUNT(menucompare) FROM data WHERE ww = 6))
          AS percentday
  FROM data
 WHERE ww > 0;

$これにより、ほとんどの変数ビットから符号が削除され、ボタンの値が 6 に置き換えられます。そうすることで、少し理解しやすくなります。

目的の出力にはmenucompare、グループ化とカウントの目的で保持される文字列の最後の 4 文字が必要なようです。

集計されるデータは、次の方法で選択されます。

SELECT SUBSTR(MenuCompare, -4) AS Last4
  FROM Data
 WHERE ww = 6

パーセンテージの除数はそのような行の数ですが、それらを数えるためにサブストリングは必要ないため、次のように記述できます。

SELECT COUNT(*) FROM Data WHERE ww = 6

とにかく、これはまさにあなたが持っているものです。

パーセンテージの被除数は、各部分文字列のグループ カウントになります。

SELECT Last4, COUNT(Last4) * 100.0 / (SELECT COUNT(*) FROM Data WHERE ww = 6)
  FROM (SELECT SUBSTR(MenuCompare, -4) AS Last4
          FROM Data
         WHERE ww = 6
       ) AS Week6
 GROUP BY Last4
 ORDER BY Last4;

これが機能することを実証したら、クエリを再パラメーター化し、結果の表示を処理できます。

于 2012-05-12T20:41:20.607 に答える