Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
SELECTпри плавающих условиях (maystrenko) 22/02/2010 - 14:26:51
      Re: SELECT при плавающих условиях ( ) 22/02/2010 - 19:03:20

> Original message text:
> From: maystrenko - 22/02/2010 - 14:26:51
> Subject:SELECTпри плавающих условиях
> -----------------
> Здравствуйте!
> Нужна помощь...
> Задача:
> из нескольких таблиц выбрать данные при условиях:
> 1 Если пользователь с указанными логином и паролем только 1 в БД
> 2 если хотя бы у одной группы, в которых состоит пользователь есть доступ к ресурсу
> 3 если есть доступ к ресурсу у нескольких групп и с разными датами окончания, то выбрать по следующим правилам:
> - если пустое (null), то берём только его - это без ограничений по времени
> - если нет доступа без ограничения, то берём максимальную дату MAX()
>
> Что у меня работает по отдельности:
>
> SELECT
> `db_table_acl`.`resourse_id`,
> `db_table_acl`.`acl_id`,
> `db_table_acl`.`expiried`
> FROM
> `db_table_acl`
> WHERE
> `db_table_acl`.`user_group_id` IN (
> SELECT
> `db_table_users_groups_sostav`.`group_id`
> FROM
> `db_table_users_groups_sostav`
> WHERE(
> `db_table_users_groups_sostav`.`user_id` IN (
> SELECT
> `db_table_users`.`id`
> FROM
> `db_table_users`
> WHERE (
> (`db_table_users`.`login` = 'login')
> AND (
> `db_table_users`.`password` = 'password')
> )
> )
> )
> )
>
> этот запрос выдаёт все варианты доступа к ресурсам указанным группам и даты окончания их доступа
>
> если добавить к этому запросу:
>
> AND (`db_table_acl`.`expiried` IS null)
>
> то получим только доступ без ограничений...
>
> ВОПРОС:
> как объяснить mysql, чтобы он выбирал данные при условии, что если есть null, то только его и показывал, а если нет null, то выбирал максимальное значение даты окончания срока доступа из всех для разных групп пользователя, у которых есть доступ?
>
> нашёл вариант с IF
> по идее должно быть в конце основного щапроса условие типа:
>
> AND IF(
> (0),
> (`db_table_acl`.`expiried` IS null),
> (`db_table_acl`.`expiried` = '1'))
>
> НО! оно не работает
> и потом вместо
> (`db_table_acl`.`expiried` = '1')
> останется только указать максимальное значение MAX()
>
> Спасибо
>


From: - 22/02/2010 - 19:03:20
Subject:SELECT при плавающих условиях
-----------------
Застопорился на варианте:

SELECT
`db_table_acl`.`resourse_id`,
`db_table_acl`.`acl_id`,
`db_table_acl`.`expiried`
FROM
`db_table_acl`
WHERE
`db_table_acl`.`user_group_id` IN (
SELECT
`db_table_users_groups_sostav`.`group_id`
FROM
`db_table_users_groups_sostav`
WHERE(
`db_table_users_groups_sostav`.`user_id` IN (
SELECT
`db_table_users`.`id`
FROM
`db_table_users`
WHERE (
(`db_table_users`.`login` = 'login')
AND (
`db_table_users`.`password` = 'password')
)
)
)
)
AND
IF(
exists(
SELECT
`db_table_acl`.`expiried`
FROM
`db_table_acl`
WHERE `db_table_acl`.`user_group_id` IN (
SELECT
`db_table_users_groups_sostav`.`group_id`
FROM
`db_table_users_groups_sostav`
WHERE(
`db_table_users_groups_sostav`.`user_id` IN (
SELECT
`db_table_users`.`id`
FROM
`db_table_users`
WHERE (
(`db_table_users`.`login` = 'login')
AND (
`db_table_users`.`password` = 'password')
)
)
)
)),
('`db_table_acl`.`expiried` is null'),
('`db_table_acl`.`expiried` = MAX(`db_table_acl`.`expiried`)')
)

по отдельности эти части работают, а вместе возврвщвется пустой результат...


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
36824



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |