2017-03-08 133 views
1

我有一个查询中,我组的结果: SELECT brand, description, prodcode FROM table GROUP BY brand, prodcode 现在的结果是:隐藏在MySQL查询重复结果

brand | description | prodcode 
------------------------------ 
Brand1, Description1, Product1 
Brand1, Description2, Product2 
Brand1, Description3, Product4 

我想看到的是:

brand | description | prodcode 
------------------------------ 
Brand1, Description1, Product1 
     Description2, Product2 
     Description3, Product4 

任何想法如何在发送到应用程序层之前抑制这些重复的数据?

+3

你可以做它服务器端..循环结果..(不是一个MySQL功能) – scaisEdge

+0

可以使用用户变量和case语句。您通常使用用户变量创建自己的控制中断逻辑,然后使用案例来查看品牌是否更改,否则显示新品牌值,否则显示为空。虽然这种类型的逻辑更适合App/Gui。 – xQbert

回答

1

总有办法。问题是“我们应该这样做”。注意通过这样做你可以隐藏品牌数据。如果数据被重新排序,分类器会失去知道哪个品牌用于哪一行的能力。如果这仅仅是一个打印的报告,不会被推断或预期为PDF,而用户无法操作数据,那么可以。但是,如果这是一个用户可以转储为excel并稍后操作...更好地拥有所有的数据。

我个人觉得这种显示的信息令人讨厌电子数据,但可以打印表格或静态报告。原因是:在电子方面,我可以导入excel并与数据一起玩;但是如果列“缺少”冗余数据,那么电子操作就会成为问题。

Working 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'); 

QUERY:

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 

结果:

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

为什么这个工程:

神奇发生在十字架上的连接和案例评估。

有1个表格。我们在加入之前对记录进行排序。我们正在创建一个名为@var的用户变量,并将其设置为''在表foo中的第一条记录上。然后我们将@var分配给第一条记录的品牌。当SQL交叉连接到第二个字段时,@var现在是第一个记录的品牌。如果品牌匹配,则不显示记录,如果品牌不匹配,我们更改@var的值并显示新值。

风险:

我们如果
  • 其他表连接发生,或者顺序不是根据需要在表格中,我们需要做一个子查询首先对“富”的品牌
  • 申请订购任何涉及品牌1的订单现在都是毫无价值的
  • 这不是可重复使用的。另一个可能希望利用数据(视图)的模块不再能够这样做,因为品牌已被隐藏在某些记录上。
+0

这绝对提供了预期的结果! –

0

您可能想要考虑在品牌列上使用SELECT DISTINCT来仅返回不同的值。欲了解更多信息:https://www.w3schools.com/sql/sql_distinct.asp。然而,在“描述”和“prodcode”方面,折叠“品牌”列只有一行,但仍然与其他三行关联。

+0

在上述情况下使用不同的结果并不会改变结果。 –