经过一番搜索和阅读后,我为我的应用程序提出了以下 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[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 查询来实现相同的结果。基本上我会添加更多类似上面的行,但条件不同,特别是在日期上。