は少し検索して読んだ後、私は自分のアプリケーションのための次のSQLクエリを思い付いた:Oracleでこの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
私は二つのことを探しています:それより経験のあるユーザ上記のコードに
- 一般的な単純化私はそうではないことを知っています。
- 私はPHPでこれをやっていますが、レコードごとにこれらの変数をすべて持つ連想配列があります。私はそれらを多次元配列にグループ化する方法を探しているので、PHPコードは読みやすくなります。もちろん、私はPHP自体でこれをやりたがりません。無意味です。例えば
、このような何か:これが可能であれば私も知らないので、それがある場合、私は本当に思ったんだけど
$info['avgAllM']
$info['countAllM']
$info['avgAllF']
$info['countAllF']
$info['avgU18M']
$info['countU18M']
$info['avgU18F']
$info['countU18F']
:
$info[0]['avgAllM']
$info[0]['countAllM']
$info[1]['avgAllF']
$info[1]['countAllF']
$info[2]['avgU18M']
$info[2]['countU18M']
$info[3]['avgU18F']
$info[3]['countU18F']
の代わりにどのようにそれを行うことができます。
なぜこのすべてが欲しいですか?上記のSQLクエリは、必要な完全なSQLの断片です。すべての作業を行う前に、同じ結果を得るためのよりコンパクトなSQLクエリがあるかどうかを知りたいからです。基本的には、上記のようないくつかの行を追加しますが、異なる条件、特に日付の行を追加します。
テーブル構造の詳細がなければ、なぜmid = 5にフィルタリングするwhere節がありますか?あなたは本当に何を達成しようとしていますか?あなたの多次元配列のために、SQLヘルプのグループではないでしょうか? – clyc
私は本当に関連性があるとは思わないが、テーブル構造で更新しました。私はGROUP BYをどのように使うことができるのかよくわかりません... –