Qual é a melhor ou mais eficiente maneira de obter vários valores de resultados agregados?
Basicamente, tenho um aplicativo de e-mail e queria obter todos os números de mensagens para cada tipo de pasta (caixa de entrada, enviada, arquivada, sinalizada...) conforme definido abaixo.
Aqui está uma amostra de coisas que estou tentando fazer em uma chamada de procedimento armazenado. (onde [uid] é o userID)
SELECT * FROM Message
Inbox WHERE [to] = [uid]
Unread WHERE [to] = [uid] and isread = 0
Flagged WHERE [to] = [uid] and isFlagged = 1
Drafts WHERE [to] = [uid] and isDraft = 1
Sent Messages WHERE [from] = [uid]
Archived Messages WHERE [to] = [uid] and isArchived = 1
COUNT..CASE é a maneira usual. Para "Enviado", é um pouco mais complicado porque é um filtro uid diferente que requer 2 consultas na tabela de mensagens
Eu usei essa construção para permitir linha zero para/de. Evita um OR e adiciona um filtro uid a cada CASE.
Cada tabela derivada (pode escrever como um CTE) retornará apenas uma linha e usei um MAX em uid para evitar GROUP BY também, caso alguém se pergunte
Editar:
Uma agregação sem GROUP BY sempre retornará um resultado (consulte SO aqui ). Eu esqueci disso.
Eu atualizei meu SQL