
この例では、すべての組み合わせに対して平均的な煙柱が必要です。ここで物事が複雑になります。
(Male,30-40,us)、(Male,30-40,ca)、(Male,30-40,th)などの平均(煙)を見つけるのは簡単ではありません。
私が欲しいのは、 (Male,30-40,(us,uk)) ,(Male,30-40,(us,uk,th)) ,,( のような単一のクエリで複数回使用できる変数です男性、30 ~ 40 歳、(us、uk、th、ca)) など。
簡単で効率的な方法はありますか?

この例では、すべての組み合わせに対して平均的な煙柱が必要です。ここで物事が複雑になります。
(Male,30-40,us)、(Male,30-40,ca)、(Male,30-40,th)などの平均(煙)を見つけるのは簡単ではありません。
私が欲しいのは、 (Male,30-40,(us,uk)) ,(Male,30-40,(us,uk,th)) ,,( のような単一のクエリで複数回使用できる変数です男性、30 ~ 40 歳、(us、uk、th、ca)) など。
簡単で効率的な方法はありますか?
簡単な方法は、独立変数/予測変数を別の列の文字列として連結し、文字列の GROUP BY に基づいて AVG(煙) を取得することです
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
次のようなすべての組み合わせを取得できます。
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:重複を修正しました。おそらく結合の方が優れている可能性がありますが、それでも正常に機能します。