Процедура, которая будет использовать внутренний вывод для создания представления - PullRequest
0 голосов
/ 30 сентября 2019

Я хочу добиться следующего. У меня есть приложение, которое использует чаты, и я хочу показать вошедшему в систему пользователю его чаты, в которых он участвует. У меня есть таблица с именем: - CHAT_USER, где я храню идентификатор разговора и пользователя и - CHAT, где у меня есть Тема и другая информация. Мой подход заключается в том, чтобы получить список идентификаторов чата, сначала выбрав то, что я получил из параметров, а затем использовать этот вывод для создания представления с активными чатами.

DELIMITER $$
CREATE DEFINER=`mysql`@`%` PROCEDURE `GetChats`(
    IN userName VARCHAR(60), 
    IN ticket INT) 
NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN
SELECT 
   ( select `CHAT_USER_ID`, `CHAT_ID`, `TICKET_ID`, `USER` from `CHAT_USER` 
        where `USER`= userName and `TICKET_ID` = ticket ) as ChatsForUser ,
   (select `r`.`CHAT_ID` ,
            `l`.`CHAT_TYPE` ,
            `r`.`TICKET_ID`,
            group_concat(`r`.`USER` separator ',') AS `USER`,
            `l`.`IS_PUBLIC` ,
            `r`.`IS_ACTIV` ,
            `l`.`CHAT_TOPIC` 
                from (`CHAT_USER` `r` left join `CHAT` `l` on((`r`.CHAT_ID` = `l`.`CHAT_ID`))) 
                where ((`r`.`IS_ACTIV` = '1') and (`r`.`USER_TYPE` <> 'INITIATOR')) 
                group by `r`.`CHAT_ID` having `r`.`CHAT_ID` IN ChatsForUser.`CHAT_ID`) as OutputChats;

       COMMIT;
END$$
DELIMITER ;

Дополнительная информация:

Table CHAT_USER
===========================================================
CHAT_USER_ID | CHAT_ID | TICKET_ID | USER | ...other fields
===========================================================

Table CHAT
============================================================================
CHAT_ID | TICKET_ID | CHAT_TYPE | CHAT_TOPIC | IS_ACTIV | IS_PUBLIC | other fields
============================================================================

I want an output that will have this:
===============================================================
CHAT_ID | TICKET_ID | USERS | IS_ACTIV | IS_PUBLIC | CHAT_TOPIC
===============================================================

УСЛОВИЯ: для отображения активных CHAT_ID на БИЛЕТЕ, где зарегистрированный пользователь участвует в разговоре. Пример вывода должен возвращать только первые 2 строки, потому что в обсуждениях участвует ME:

12 | 234 | me, user1, user 4  | 1 | 1 | Problem 1
14 | 234 | me, user56, user 9 | 1 | 1 | Problem 233
19 | 234 | user44, user 19    | 1 | 1 | Problem 12
22 | 234 | user33, user 22    | 1 | 1 | Problem 230

Возможно ли это? Если нет, можете дать какие-нибудь идеи, как этого добиться? Заранее спасибо!

1 Ответ

1 голос
/ 30 сентября 2019

Вы можете попробовать выполнить инструкцию Select перед тем, как начать процедуру, и посмотрите, вернет ли она нужные данные. Только тестирование возможно с фактическими данными и желаемым результатом.

SELECT 
  c.CHAT_ID,c.TICKET_ID
  ,GROUP_CONCAT(DISTINCT Cu.USER  ORDER BY Cu.USER  SEPARATOR ', '),
  MAX(cu.IS_ACTIV), MAX(cu.IS_PUBLIC),MAX(cu.CHAT_TOPIC)
FROM CHAT C inner join CHAT_USER cu 
On c.CHAT_ID = cu.CHAT_ID and c.TICKET_ID  =cu.TICKET_ID;
GROUP BY c.CHAT_ID,c.TICKET_ID

Попробуйте, если оно даст ожидаемый результат

DELIMITER $$
CREATE DEFINER=`mysql`@`%` PROCEDURE `GetChats`(
    IN userName VARCHAR(60), 
    IN ticket INT) 
NOT DETERMINISTIC CONTAINS SQL SQL SECURITY DEFINER 
BEGIN

SELECT 
  c.CHAT_ID,c.TICKET_ID
  ,GROUP_CONCAT(DISTINCT Cu.USER  ORDER BY Cu.USER  SEPARATOR ', '),
  MAX(c.IS_ACTIV), MAX(c.IS_PUBLIC),MAX(c.CHAT_TOPIC)
FROM CHAT C 
inner join (SELECT * FROM CHAT_USER WHERE `CHAT_ID` 
         in 
         (SELECT `CHAT_ID` FROM  CHAT_USER WHERE `USER` Like userName )) cu 
On c.CHAT_ID = cu.CHAT_ID and c.TICKET_ID  =cu.TICKET_ID
WHERE c.TICKET_ID = ticket
GROUP BY c.CHAT_ID,c.TICKET_ID;
END$$
DELIMITER ;

Эта процедура предоставит вам все чаты и пользователей. на конкретный идентификатор билета. Как я сказал в комментарии. я не совсем понимаю вашу хранимую процедуру.

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