Есть ли способ сделать запрос выбора с разными где для двух разных условий? - PullRequest
0 голосов
/ 23 апреля 2020

Я хочу сделать запрос, который использует select для отображения отчетов в таблице, содержание таблицы, которое будет отображаться, зависит от даты транзакции и группы пользователей, которые вошли в систему, если группа пользователей - обычный пользователь, пользователь только могут видеть отчеты, которыми он / она управляет, только если группа пользователей является администратором, тогда пользователь может видеть все отчеты.

вот пример моего незавершенного запроса: (отредактировано)

SELECT store_id, type, tx_date, status, amount1, amount2, total
FROM table1 t1 JOIN user_rights us ON t1.store_id = us.store_id
WHERE us.user_group IS NOT 'admin' AND us.uname = {logged in username} AND tx_date = {date inputed by user}

как видите, этот запрос отображается только тем, что видят обычные пользователи. Моя проблема, когда пользователь, который вошел в систему, является администратором. Запрос не может отобразить все данные, о которых сообщается, потому что данные уже отфильтрованы.

Так что я думаю, что запрос только для администратора: (отредактировано)

SELECT t1.store_id, type, tx_date, status, amount1, amount2, total
FROM table1 t1 JOIN user_rights us ON t1.store_id = us.store_id
WHERE tx_date = {date inputed by user}

Вот как выглядит таблица user_rights

|   rights_id   |   uname   |  user_group  |  store_id  |
---------------------------------------------------------
|     r0001     |   a0001   |     admin    |     a1     |
|     r0002     |   u0001   |     user     |     a2     |
|     r0003     |   u0002   |     user     |     b1     |
|     r0004     |   u0002   |     user     |     b2     |

Пример результата, который я хочу получить admin (a0001) для даты (14/4/20) выглядит так:

|  store_id  |  type  |  tx_date  |  status  |  amount1  |  amount2  |  total  |
--------------------------------------------------------------------------------
|     a1     |  groc  |  14/4/20  |   done   |    10000  |     -     |  10000  |
|     a2     |  supp  |  14/4/20  |   pend   |    30000  |    50000  |  80000  |
|     b1     |  supp  |  14/4/20  |   pend   |    40000  |    20000  |  60000  |
|     b2     |  supp  |  14/4/20  |   pend   |    30000  |    50000  |  80000  |

Пример результата, который я хочу получить для пользователя (u0001) для даты (14/4/20), выглядит следующим образом:

|  store_id  |  type  |  tx_date  |  status  |  amount1  |  amount2  |  total  |
--------------------------------------------------------------------------------
|     a2     |  supp  |  14/4/20  |   pend   |    30000  |    50000  |  80000  |

Пример результата, который я хочу получить для пользователя (u0002) на дату (14/4/20), выглядит следующим образом:

|  store_id  |  type  |  tx_date  |  status  |  amount1  |  amount2  |  total  |
--------------------------------------------------------------------------------
|     b1     |  supp  |  14/4/20  |   pend   |    40000  |    20000  |  60000  |
|     b2     |  supp  |  14/4/20  |   pend   |    30000  |    50000  |  80000  |

есть ли какой-либо возможный способ использовать только выбор для решения эта проблема?

edit: я делаю ошибку раньше, таблица 1 содержит данные транзакции магазина, я добавила некоторые подробности из примера, я изменила таблицу пользователя в таблицу user_rights, потому что я думаю, что моя информация неясна Я надеюсь, что информация, которую я добавлю, поможет вам лучше понять, в чем заключается моя проблема. Извините за большое редактирование, потому что я впервые публикую здесь.

примечание: поскольку это единственная цель отчетности, это должно быть выполнено только в утверждении select. Создание новых таблиц или других процедур считается ненужным, поскольку этот запрос используется только для одного отчета.

Ответы [ 4 ]

0 голосов
/ 23 апреля 2020

Рассматривали ли вы or?

SELECT store_id, type, tx_date, status, amount1, amount2, total
FROM table1 t1 JOIN
     user us
     ON t1.store_id = us.store_id
WHERE tx_date = {date inputed by user} AND
      ( (us.user_group IS NOT 'admin' AND us.uname = {logged in username}) OR
        (us.user_group = 'admin')
      );

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

0 голосов
/ 23 апреля 2020

Должно ли это быть выполнено в одном утверждении? Не могли бы вы сделать первый вызов, используя логин администратора c, сохранить его во временной таблице, добавив в конец столбец, который заполняется с помощью оператора Case. что-то вроде: если us.usergroup = admin, то введите идентификатор пользователя, иначе, если us.id = t1.id, затем введите идентификатор пользователя.

Затем вы можете использовать второй оператор выбора, который извлекает все записи из временная таблица, в которой идентификатор пользователя находится в новом столбце временной таблицы.

Надеюсь, я правильно интерпретировал ваш вопрос.

0 голосов
/ 23 апреля 2020

Вы можете использовать оператор IF, чтобы проверить, является ли пользователь администратором или нет, и вызвать соответствующий запрос. Что-то вроде:

IF({SELECT TO THECK IF USER = 'admin'})
BEGIN
    SELECT id, type, time, status, amount1, amount2, total
    FROM table1 t1 JOIN user us ON t1.id = us.id
    WHERE tx_date = {date inputed by user}
END
ELSE
BEGIN
    SELECT id, type, tx_date, status, amount1, amount2, total
    FROM table1 t1 JOIN user us ON t1.id = us.id
    WHERE us.user_group IS NOT 'admin' AND us.uname = {logged in username} AND tx_date = {date inputed by user}
END
0 голосов
/ 23 апреля 2020

Предполагая, что вы хотите отображать столбцы только с table1, вы можете использовать exists для фильтрации с условными логами c:

select t1.*
from table1 t1
where 
    t1.tx_date = ?
    and exists (
        select 1 
        from users u
        where 
            u.Name = ?
            and (us.user_group = 'admin' or u.id = t1.id)
    )

Где вопросительные знаки представляют (соответственно) дату вводится пользователем и его именем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...