Às vezes, ao criar uma consulta com o explorador de dados, você encontrará códigos em vez de seus equivalentes textuais nos resultados. O campo geralmente tem uma chave na árvore do explorador de dados, mas estas não costumam ser tão úteis nos resultados (a menos que você tenha conseguido memorizá-las todas
)
Existem algumas coisas que você pode usar para torná-las mais fáceis de ler e muito mais compartilháveis com outras pessoas.
Primeiro…
VALUES
A primeira consulta foi criada para buscar todas as notificações que um usuário recebeu para um tópico específico, mas, em vez de apenas o código notification_type, VALUES é usado para criar uma tabela temporária e mapear cada um para seus correspondentes muito mais legíveis por humanos:
-- Define parâmetros para user_id e topic_id
-- [params]
-- user_id :user_id
-- topic_id :topic_id
-- Cria uma Common Table Expression (CTE) chamada ntypes
-- Esta CTE mapeia nomes de tipos de notificação para seus IDs correspondentes
WITH ntypes(notification_type, notification_type_id) AS (
VALUES
-- Define pares de tipos de notificação e seus IDs correspondentes
('mentioned', 1),
('replied',2),
('quoted',3),
('edited', 4),
('liked', 5),
('private_message', 6),
('invited_to_private_message', 7),
('invitee_accepted', 8),
('posted', 9),
('moved_post', 10),
('linked', 11),
('granted_badge', 12),
('invited_to_topic', 13),
('custom', 14),
('group_mentioned', 15),
('group_message_summary', 16),
('watching_first_post', 17),
('topic_reminder', 18),
('liked_consolidated', 19),
('post_approved', 20),
('code_review_commit_approved', 21),
('membership_request_accepted', 22),
('membership_request_consolidated', 23),
('bookmark_reminder', 24),
('reaction', 25),
('votes_released', 26),
('event_reminder', 27),
('event_invitation', 28),
('chat_mention', 29),
('chat_message', 30),
('chat_invitation', 31),
('chat_group_mention', 32),
('chat_quoted', 33),
('assigned', 34),
('question_answer_user_commented', 35),
('watching_category_or_tag', 36),
('new_features', 37),
('admin_problems', 38),
('following', 800),
('following_created_topic', 801),
('following_replied', 802),
('circles_activity', 900)
)
-- Consulta a tabela de notificações (alias n), unindo-a com a CTE ntypes com base no notification_type
SELECT user_id, ntypes.notification_type, read, topic_id, created_at
FROM notifications n
JOIN ntypes
ON n.notification_type = ntypes.notification_type_id
-- Filtra as notificações para incluir apenas aquelas que pertencem a um usuário específico e a um tópico específico
WHERE user_id = :user_id
AND topic_id = :topic_id
-- Ordena as notificações resultantes em ordem decrescente pelo timestamp created_at
ORDER BY created_at DESC
Usar VALUES é útil quando a lista é longa, pois pode tornar a consulta mais fácil de ler. Também permite que você vincule a nova tabela temporária que ela cria a outra, o que pode ser muito útil. A tabela temporária também pode ajudar a melhorar a eficiência em comparação com uma série de instruções CASE.
O que nos leva à segunda…
CASE
Alternativamente, se a lista for muito menor, você também pode usar CASE para um efeito semelhante. Aqui está um para post_type:
-- [params]
-- topic_id :topic_id
SELECT p.id AS post_id,
-- Inicia a instrução CASE para mapear códigos numéricos de post_type para descrições de string
CASE
WHEN post_type = 1 THEN 'regular'
WHEN post_type = 2 THEN 'moderator_action'
WHEN post_type = 3 THEN 'small_action'
WHEN post_type = 4 THEN 'whisper'
END
FROM posts p
WHERE p.topic_id = :topic_id
ORDER BY created_at DESC
Essas consultas de exemplo podem não ser muito úteis por si só, mas servem mais para demonstrar os princípios. Espero que ajudem, mas se tiver alguma dúvida, por favor, pergunte abaixo. ![]()

