sql >> Base de Datos >  >> RDS >> Mysql

Ocultar resultados duplicados en la consulta de MySQL

Siempre hay una manera. La pregunta es "¿Deberíamos hacer esto?". Tenga en cuenta que al hacer esto, oculta los datos de la marca. Si los datos se reordenan, el clasificador pierde la capacidad de saber qué marca es para qué fila. Si esto es solo un informe impreso que no se debe recurrir o esperar a un PDF donde un usuario no puede manipular los datos, entonces está bien. Pero si esto es así, un usuario puede volcar a Excel y manipular más tarde... mejor todos los datos.

Personalmente, encuentro desagradable esta visualización de información en datos electrónicos, pero está bien en formularios impresos o informes estáticos. La razón:en formato electrónico, puedo importar a excel ordenar y jugar con los datos; pero si las columnas "faltan" datos redundantes, la manipulación electrónica se vuelve problemática.

Funcionamiento de 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');

CONSULTA:

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 qué esto funciona:

La magia ocurre en la unión cruzada y en la evaluación del caso.

Hay 1 mesa. Estamos clasificando los registros antes de unirnos. Estamos creando una variable de usuario llamada @var y configurándola en '' en el primer registro de la tabla foo. Luego asignamos @var a la marca del primer registro. Cuando la cruz SQL se une al segundo archivo, @var ahora es la marca del primer registro. Si las marcas coinciden, no se muestra ningún registro; si las marcas no coinciden, cambiamos el valor de @var y mostramos el nuevo valor.

Riesgos:

  • si se producen otras combinaciones de tablas, o si el orden no es el deseado en la tabla, primero tendríamos que hacer una subconsulta en "foo" para ordenar por marca
  • aplicar cualquier pedido a esto que involucre a la marca 1 ahora no tiene valor
  • No es tan reutilizable. Otro módulo que puede querer aprovechar los datos (vista) ya no puede hacerlo porque la marca se ha ocultado en algunos de los registros.