Страницы

Поиск по вопросам

четверг, 11 июля 2019 г.

Запрос данных 4-х таблиц

Задача сделать запрос который получает данные из таблицы, которая не связана напрямую с таблицей условия. В общем до сих пор слишком сложно, попробую нарисовать.
4 таблицы:
+cases-------------+client-----------+punishment---------+default_values+ |case_name |client_id(связан)|punishment_id |max_case_value| |client_id(связан>)| |client_id (<связан)|min_case_value| |case_value | |punishment_value | |
В конце концов эти данные мне нужно будет отобразить вот так: Вывести название дела и расчет максимальное значение(оно всегда одинаковое) - case_value(свое для каждого дела) - punishment_value(свое для каждого клиента)
case_name1 max_case_value - case_value1 - punishment_value
Отнимать буду в PHP, но я запутался настолько что не понимаю как получить эти данные в свои переменные для удобного циклического прохода по ним.
Если непонятно - задайте вопрос, я отлично понимаю что я обьясняю очень плохо, но не знаю как описать лучше.


Ответ

Ну например как нибудь так:
SELECT CL.client_full_name,C.client_id,C.case_name,C.case_value, (SELECT IFNULL(sum(punishment_value),0) FROM punishment P WHERE P.client_id=C.client_id) punishment_val, D.max_case_value FROM cases C, default_values D, client CL WHERE CL.client_id=C.client_id
Так как default_values не связана с остальными таблицами никакими условиями в ней обязана быть одна и только одна запись. Либо, если записей там несколько надо условиями отбора добиться что бы выбиралась требуемая. В случае если вопреки всем ожиданиям в ней окажется более 1 записи то результирующих строк под одному делу окажется несколько.
Я намеренно не использовал JOIN т.к. в простых случаях в большинстве СУБД они не требуются, в них появляется необходимость только в случае LEFT JOIN
Вариант 2 (с LEFT JOIN):
SELECT CL.client_full_name,C.client_id,C.case_name,C.case_value, D.max_case_value, IFNULL(sum(punishment_value),0) punishment_val FROM default_values D,client CL, cases C LEFT JOIN punishment P ON P.client_id=C.client_id WHERE CL.client_id=C.client_id GROUP BY CL.client_full_name,C.client_id,C.case_name,C.case_value
Оба варианта в принципе равнозначны. Я привел их что бы показать степени свободы при написании запросов.

Комментариев нет:

Отправить комментарий