Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Ocultar resultados duplicados na consulta MySQL


Sempre há um jeito. A pergunta é "Devemos fazer isso". Observe que, ao fazer isso, você oculta os dados da marca. Se os dados forem reordenados, classificados, o classificador perde a capacidade de saber qual marca é para qual linha. Se este é apenas um relatório impresso que não deve ser recorrido ou esperado para um PDF onde um usuário não pode manipular os dados, então ok.. todos os dados.

Pessoalmente, acho desagradável essa exibição de informações em dados eletrônicos, mas ok em formulários impressos ou relatórios estáticos. O motivo:no eletrônico consigo importar para o excel ordenar e brincar com os dados; mas se as colunas estiverem "faltando" dados redundantes, a manipulação eletrônica se tornará problemática.

Trabalhando com SQLfiddle
CREATE Table foo (
 brand varchar(20),
 description varchar(20),
 prodcode varchar(20));


Insert into foo values ('Brand1', 'Description1', 'Product1'),
('Brand1', 'Description2', 'Product2'),
('Brand1', 'Description3', 'Product4'),
('Brand2', 'Description3', 'Product4'),
('Brand2', 'Description3', 'Product4'),
('Brand1', 'Description3', 'Product3');

INQUERIR:
SELECT case [email protected] <> f.brand then @Var :=brand end as Brand
     , f.description
     , f.prodcode
FROM (SELECT * FROM foo ORDER BY brand, description, prodcode) f
CROSS JOIN  (SELECT @var := '') b

RESULTADOS:
Brand   description     prodcode
Brand1  Description1    Product1
(null)  Description2    Product2
(null)  Description3    Product3
(null)  Description3    Product4
Brand2  Description3    Product4
(null)  Description3    Product4

Por que isso funciona:

A mágica acontece no cross join e na avaliação do caso.

Há 1 mesa. Estamos classificando os registros antes de nos juntarmos. Estamos criando uma variável de usuário chamada @var e definindo-a como '' no primeiro registro da tabela foo. Em seguida, atribuímos @var à marca do primeiro registro. Quando o SQL cross se junta ao 2º arquivo @var agora é a marca do primeiro registro. Se as marcas corresponderem, nenhum registro é exibido, se as marcas não corresponderem, alteramos o valor de @var e exibimos o novo valor.

Riscos:
  • nós, se ocorrerem outras junções de tabela, ou se a ordem não for a desejada na tabela, precisaremos fazer uma subconsulta primeiro em "foo" para pedir por marca
  • aplicar qualquer pedido que envolva brand1 agora não tem valor
  • Não é tão reutilizável. Outro módulo que pode querer aproveitar os dados (visualização) não pode mais fazê-lo porque a marca foi ocultada em alguns dos registros.