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

我想选择那些在最后一个数据中具有相同单词的人并制作百分比。

输出应该是这样的:

  • bool -- 50% (2 个条目)
  • 鞋跟—— 25% (1 个条目)
  • itoo -- 25% (1 个条目)

对我的 SQL 的任何清晰将不胜感激。我周围没有找到类似的东西。

4

2 回答 2

3

好吧,以这种格式保存数据可能不是最好的方法,如果可能的话,将字段分成 2 个单独的字段。

首先,您需要从字段末尾提取字符串部分。

  • 如果字符串/数字部分的长度是固定的,那么这很容易;
  • 如果没有,您应该使用正则表达式,不幸的是,MySQL 默认不存在。有一个解决方案,检查这个问题:How to do a regular expression replace in 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

在解决这样的问题时,我会分两步进行:

  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用于分组和计数目的。

要汇总的数据将通过以下方式选择:

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 回答