少し検索して読んだ後、アプリケーション用に次の SQL クエリを思いつきました。
SELECT
ROUND(AVG(CASE WHEN gender = 'M' THEN rating END), 1) avgAllM,
COUNT(CASE WHEN gender = 'M' THEN rating END) countAllM,
ROUND(AVG(CASE WHEN gender = 'F' THEN rating END), 1) avgAllF,
COUNT(CASE WHEN gender = 'F' THEN rating END) countAllF,
ROUND(AVG(CASE WHEN gender = 'M' AND UserAge(birth_date) <= 18 THEN rating END), 1) avgU18M,
COUNT(CASE WHEN gender = 'M' AND UserAge(birth_date) <= 18 THEN rating END) countU18M,
ROUND(AVG(CASE WHEN gender = 'F' AND UserAge(birth_date) <= 18 THEN rating END), 1) avgU18F,
COUNT(CASE WHEN gender = 'F' AND UserAge(birth_date) <= 18 THEN rating END) countU18F
FROM movie_ratings mr INNER JOIN accounts a
ON mr.aid = a.aid
WHERE mid = 5;
そして、可能であれば、これをどのように単純化できるか疑問に思っています。birth_date
フィールドは型DATE
であり、そのUserAge
日付フィールドから年齢を計算する関数です。
テーブル構造は次のとおりです。
[ACCOUNTS]
aid(PK), birth_date, gender
[MOVIE_RATINGS]
mid(PK), aid(PK,FK), rating
私は2つのことを探しています:
- 経験豊富なユーザーが知っていて、私が知らない上記のコードの一般的な単純化。
- 私はこれを PHP で行っており、レコードごとに、これらすべての変数を含む連想配列を作成します。それらを多次元配列にグループ化する方法を探しているので、PHP コードが読みやすくなります。もちろん、PHP 自体でこれを実行したくはありません。無意味です。
たとえば、次のようなものです。
$info[0]['avgAllM']
$info[0]['countAllM']
$info[1]['avgAllF']
$info[1]['countAllF']
$info[2]['avgU18M']
$info[2]['countU18M']
$info[3]['avgU18F']
$info[3]['countU18F']
それ以外の:
$info['avgAllM']
$info['countAllM']
$info['avgAllF']
$info['countAllF']
$info['avgU18M']
$info['countU18M']
$info['avgU18F']
$info['countU18F']
これが可能かどうかさえわからないので、それが可能かどうか、そしてどのように可能かについて本当に疑問に思っています。
なぜ私はこれをすべてしたいのですか?上記の SQL クエリは、実行する必要がある完全な SQL の一部にすぎません。すべての作業を行う前に、同じ結果を達成するためのよりコンパクトな SQL クエリがあるかどうかを知りたいので、まだ行っていません。基本的に、上記のような行をいくつか追加しますが、特に日付については条件が異なります。