选择具有相同字母的数据

时间:2012-05-12 19:26:19

标签: mysql sql

我遇到了这个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的任何清晰都将非常感激。 我没有找到类似的东西。

2 个答案:

答案 0 :(得分:3)

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

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

  • 如果字符串/数字部分的长度是固定的,那么它很容易;
  • 如果没有,你应该使用正则表达式,遗憾的是,默认情况下不存在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的变体here

答案 1 :(得分:2)

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

  1. 独立于表示语言排序SQL(PHP?)。
  2. 在您知道正确的查询后,对查询的参数化进行排序并显示结果。
  3. 由于这个问题被标记为'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
    

    这正是你所拥有的。

    百分比中的divdend将是每个子字符串的组计数。

    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;
    

    当您证明这是有效的时,您可以重新参数化查询并处理结果的呈现。