2017-03-08 137 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

在上述情況下使用不同的結果並不會改變結果。 –