1

Example of Data

In this example, I want average smoke column for every combination. Here when thing get complicate.

It's NOT simple as find average(smoke) of (Male,30-40,us),(Male,30-40,ca),(Male,30-40,th) and so on.

What I want is some variable can use for more than 1 times in a single query like (Male,30-40,(us,uk)) ,(Male,30-40,(us,uk,th)) ,,(Male,30-40,(us,uk,th,ca)) and more.

Any simple,efficient way to do?

4

3 回答 3

0

你可以得到这样的每个组合:

SELECT q.sort_key,avg(s.id)
FROM foo AS s
JOIN
  (SELECT GROUP_CONCAT(f0.bar) AS sort_key
   FROM foo AS f1
   JOIN foo AS f2 ON f1.bar<=f2.bar
   JOIN foo AS f3 ON f2.bar<=f3.bar
   JOIN foo AS f0 ON f0.bar=f1.bar OR f0.bar=f2.bar OR f0.bar=f3.bar
   GROUP BY f1.bar,f2.bar,f3.bar) AS q ON find_in_set(s.bar,q.sort_key)
GROUP BY q.sort_key;

http://sqlfiddle.com/#!2/1fdbf/32

由于 MySQL 不支持递归 CTE,因此您必须使用尽可能多的表,因为该参数可能有不同的值(2 代表性别,4(?)代表国家等等)。一旦您对所有参数进行了可能的组合,请对它们进行笛卡尔连接并按它们进行分组。在 PHP 中,您只需将 (male,female) 之类的排序键更改为 ALL GENDERS。

EDIT2:修复了欺骗,可能加入可能会更好,但它仍然可以正常工作。

于 2013-03-08T17:14:16.473 回答
0

一种简单的方法是将独立/预测变量连接为单独列中的字符串,然后根据字符串的 GROUP BY 获取 AVG(smoke)

ALTER TABLE `statistical_data` ADD `variables_string` VARCHAR( 255 ) NOT NULL 

UPDATE `statistical_data` SET`variables_string` = CONCAT(`gender`, `age`, `country`)

SELECT `gender`, `age`, `country`, AVG(smoke) FROM `statistical_data`GROUP BY `variables_string`

例如,可以使用 WHERE 子句来获取所有组合 WHERE 性别为男性的平均值,但您必须将所有组合的烟雾总和(1 的数量)除以组合的频率 (n),因为您不能取平均值。

SELECT (SUM(smoke_sum) / SUM(smoke_count)) FROM (SELECT `gender`, `age`, `country`, SUM(smoke) AS smoke_sum, COUNT(smoke) AS smoke_count FROM`statistical_data` WHERE `gender` = 'male' GROUP BY variables_string ) AS t2
于 2013-03-08T20:43:34.990 回答
0

如果可以的话,我建议对您的数据进行规范化,以便更容易使用内置函数来实现您的目标。这可能比提出一个可以按照您现在的方式工作的查询要快。

于 2013-03-08T15:57:54.020 回答