Существуют ли стандарты написания сложных вложенных SQL запросов?

Для пересчета статистики приходится писать сложные запросы с большим количеством вложенности, вида:
UPDATE staff
SET rating = (
  (
    SELECT SUM(value * weight) AS a
    FROM `ratings`
    WHERE entity_type = 'DOCTOR'
          AND entity_id = staff.url
          AND entity_city = (SELECT city
                             FROM clinics
                             WHERE clinics.account_id = staff.account_id
                            )
          AND published = 1
  )
  /
  (
    SELECT SUM(weight) AS b
    FROM `ratings`
    WHERE entity_type = 'DOCTOR'
          AND entity_id = staff.url
          AND entity_city = (SELECT city
                             FROM clinics
                             WHERE clinics.account_id = staff.account_id
                            )
          AND published = 1
  )
),
  ratingCommentCount = (
    SELECT COUNT(*) AS count
    FROM `ratings`
    WHERE entity_type = 'DOCTOR'
          AND entity_id = staff.url
          AND entity_city = (SELECT city
                             FROM clinics WHEREclinics.account_id = staff.account_id
                            )
AND published = 1
);


Есть ли какие то правила по написанию многоэтажного ЧИТАБЕЛЬНОГО sql кода?

При написании через Query Builder читабельность становится еще хуже, да и писать иногда сложнее если логика сложнее простой выборки.

Выполнять отдельными запросами - на порядок медленнее на большой таблице (250.000).

Советовать оптимизировать запрос или денормализировать выше не надо, это для примера.

На PHP пробовал писать как то так:

$aSumSql = 'SELECT SUM(value * weight)'; 
$bSumSql = 'SELECT SUM(weight)'; 
DB::update("UPDATE staff SET rating = ($aSumSql) / ($bSumSql), ...............");


Но не ясно, так красивее или еще хуже. =)
Написано 2 минуты назад
  • Вопрос задан
  • 265 просмотров
Решения вопроса 2
DevMan
@DevMan Куратор тега PHP
стандартов нет.
есть правило - многострочный код должен быть единообразным и отформатированным.

я в таких случаях использую строки для хранения запроса и raw query для его выполнения.
Ответ написан
@Draconian
Oracle Developer
В том, что запрос большой и в нем многабукаф ничего страшного нет, важно чтобы форматирование было единообразное, а если коллегам сложно понять, что запрос делает - пишите комментарии.
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
Выведите одним запросом все суммы, и вторым делайте UPDATE.
Ответ написан
@MoonMaster
Программист и этим все сказано
Стандартов нет. Но вы можете договориться об условном стандарте внутри своей команды. Например, что все команды будут начиться с новой строчки, служебные слова будут в верхнем регистре и т.д.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы