powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Значение стобца на основе максимального значения в строке выборки.
8 сообщений из 8, страница 1 из 1
Значение стобца на основе максимального значения в строке выборки.
    #39150369
DeMonyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Тему назвал как мог, сильно не пинайте. Объяснить задачу коротко не получается.
Есть таблицы:
users (id_user, tariff, всякие другие поля)
corporations (id_corp, corp, tariff, всякие другие поля)
corp_users (id, corp, user)
parties (id_party, party, tariff, всякие другие поля)
party_users (id, party, user)
tariffs (id_tariff, tariff, tariff_rights_user, всякие другие поля)

Тарифы задают права пользователя, права корпорации и права партии (три столбца, интересует только первый). Причём корпоративные тарифы и партийные тарифы могут повышать права пользователя. То есть для определения прав пользователя надо выбрать максимальное значение из трёх. Это у меня получилось сделать. Но теперь не пойму можно ли в этом же запросе или отдельно одним запросом, определить по какому тарифу назначены права? Ниже запрос по которому можно вывести таблицу пользователей с окончательными правами. Собственно в идеале вывести третий столбец tariff_name - которые будет равен t_user.tariff, t_corp.tariff или t_party.tariff в зависимости от того что выбрано GREATEST.

SELECT users.user, GREATEST(t_user.tariff_rights_user, t_corp.tariff_rights_user, t_party.tariff_rights_user) FROM users
inner join tariffs t_user on t_user.id_tariff=users.tariff
inner join corporation_users on corporation_users.user=users.id_user
inner join corporations on corporations.id_corp=corporation_users.corp
inner join tariffs t_corp on t_corp.id_tariff=corporations.corp_tariff
inner join party_users on party_users.user=users.id_user
inner join parties on party_users.party=parties.id_party
inner join tariffs t_party on t_party.id_tariff=parties.party_tariff

Это вообще реально сделать или проще не насиловать себе мозг и на PHP это сделать с несколькими запросами?
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39150391
DeMonyan,

тебе прямая дорога в Ф.А.К.
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39150496
DeMonyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый Э - Эх,

Там нет ничего похожего на мою задачу. Мне надо определить из какой таблице в итоге берётся значение.
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39150567
SharuPoNemnogu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39150579
DeMonyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SharuPoNemnogu,

Это судя по всему то что мне нужно! ) Просто не особо понимал даже как гуглить.
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39150806
DeMonyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Я видимо не совсем корректно описал задачу... С кейсами всё отлично получается, в плане определения имени столбца, но нужно получить не просто имя, а имя в таком виде в котором его дальше можно использовать в SQL, точнее нужно получить название тарифа...

Итого запрос получился вот таким, не знаю насколько это через седалищный нерв, но мне пока только такой вариант в голову пришёл. Если кто знает как это можно сделать проще, буду очень признателен.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
SELECT @name:=users.user, @var_max_val:= GREATEST( t_user.tariff_rights_user, IFNULL(t_corp.tariff_rights_user,0), IFNULL(t_party.tariff_rights_user,0)) As final_user_rights, 
CASE @var_max_val WHEN t_user.tariff_rights_user THEN (SELECT tariff_name FROM tariffs inner join users on users.tariff=tariffs.id_tariff where users.user=@name limit 1)
                  WHEN t_corp.tariff_rights_user THEN (SELECT tariff_name FROM tariffs inner join corporations on corporations.corp_tariff=tariffs.id_tariff inner join corporation_users on corporation_users.corp=corporations.id_corp inner join users on users.id_user=corporation_users.user where users.user=@name limit 1)
                  WHEN t_party.tariff_rights_user THEN (SELECT tariff_name FROM tariffs inner join parties on parties.party_tariff=tariffs.id_tariff inner join party_users on party_users.party=parties.id_party inner join users on users.id_user=party_users.user where users.user=@name limit 1)
END AS final_tarif
FROM users
INNER JOIN tariffs t_user ON t_user.id_tariff = users.tariff
LEFT JOIN corporation_users ON corporation_users.user = users.id_user
LEFT JOIN corporations ON corporations.id_corp = corporation_users.corp
LEFT JOIN tariffs t_corp ON t_corp.id_tariff = corporations.corp_tariff
LEFT JOIN party_users ON party_users.user = users.id_user
LEFT JOIN parties ON party_users.party = parties.id_party
LEFT JOIN tariffs t_party ON t_party.id_tariff = parties.party_tariff
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39151052
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DeMonyan,

если все работает как вы хотите -- то и ладно.
но...
у одного юзера сколько партий и сколько корпораций может быть?
если только по ноль или одной -- то вроде сработает.

Но если есть многопартийцы или многокорпоратиовшики ,
то появятся множественые линии с одним и темже юзером.
Т.е. если человек в 3-х партиях и в 3-х корпорациях --
вы имеет 9 комбинаций, в каждой будет 3 тарифа юсера-партии-корпорации.

я бы собрал (UNION 3 селекта) 7 записей -- отдельно тариф юзера (юзеров),
3 тарифа партии (каждого юзера) и 3 тарифа от корпорации (каждого юзера)
и свел задачу к Ф.А.К.
http://www.sql.ru/forum/687908/faq-vyborka-pervoy-posledney-zapisi-v-gruppah


...или сделал бы таки на PHP...
...
Рейтинг: 0 / 0
Значение стобца на основе максимального значения в строке выборки.
    #39151066
DeMonyan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc,

Партии и корпорации могут быть несколько, но там свои тонкости в этих случаях. конкретно в этот запрос партия или корпорация попадать будет только одна! ) Просто не хочу лишней информацией нагружать людей, мне и так очень сильно помогли, ибо о существовании CASE в селекте я даже не догадывался. ))
Логика то правильно срабатывает, но было подозрение, что можно упростить запрос. И как оказалось действительно можно. Вместо подзапросов вполне можно использовать имена столбцов в кейсах. Сразу пытался так сделать, но почему-то мускул на меня ругался, в итоге сделал подзапросы, но вчера попробовал ещё раз с именами столбцов и всё отлично сработало.
Спасибо всем!
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Значение стобца на основе максимального значения в строке выборки.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]