【发布时间】:2011-01-04 23:13:34
【问题描述】:
经过一番搜索和阅读后,我为我的应用程序提出了以下 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 查询来实现相同的结果。基本上我会再添加几行与上面类似的行,但条件不同,特别是在日期上。
【问题讨论】:
-
如果没有更多关于表结构的详细信息,为什么会有一个过滤 mid = 5 的 where 子句?你真正想要达到什么目的?对于您的多维数组,sql 帮助中的 group by 不是吗?
-
更新了表结构,尽管我认为它们并不相关。我不确定如何使用 GROUP BY...