После поиска и чтения немного я придумал следующий запрос SQL для моего приложения:Как я могу упростить этот SQL-запрос в Oracle?
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-запрос для достижения того же результата. В основном я добавлю еще несколько строк, например, выше, но с разными условиями, особенно на дату.
Без дополнительной информации о структуре вашей таблицы Почему у вас есть предложение where, которое фильтрует для mid = 5? Чего вы действительно пытаетесь достичь? для вашего многомерного массива, не будет ли в группе sql help? – clyc
Обновлен табличными структурами, хотя я не думаю, что они актуальны. Я не уверен, как я могу использовать GROUP BY для этого ... –