2009-10-15 66 views
2

我有一個MySQL表設置像這樣:GROUP_CONCAT和DISTINCT都很棒,但我如何擺脫這些重複我仍然有?

 
id uid keywords 
-- --- --- 
1 20 corporate 
2 20 corporate,business,strategy 
3 20 corporate,bowser 
4 20 flowers 
5 20 battleship,corporate,dungeon 

我想我的輸出看起來像爲:

 
20 corporate,business,strategy,bowser,flowers,battleship,dungeon 

,但我已經得到最接近的是:

 
SELECT DISTINCT uid, GROUP_CONCAT(DISTINCT keywords ORDER BY keywords DESC) AS keywords 
FROM mytable 
WHERE uid !=0 
GROUP BY uid 

其中輸出:

 
20 corporate,corporate,business,strategy,corporate,bowser,flowers,battleship,corporate,dungeon 

有沒有人有解決方案?感謝提前一噸!

+0

感謝球員,我忘了提及避免大量額外的代碼(包括搜索的東西),我想盡量保持結構,如果可能的話。 – taber 2009-10-15 05:00:32

回答

5

你正在做的事對於純數據庫來說是不可能的,因爲你的數據結構是這樣的。

沒有SQL實現將看「公司」和「公司,業務」,並將它們視爲相同的字符串。因此,截然不同的工作。

如果你能控制的數據庫,

我會做的第一件事就是改變數據設置爲:

id uid keyword  <- note, not keyword**s** - **ONE** value in this column, not a comma delimited list 
1 20 corporate 
2 20 corporate 
2 20 business 
2 20 strategy 

更重要的是將

id uid keywordId  
1 20 1 
2 20 1 
2 20 2 
2 20 3 

用一個單獨的表關鍵字

KeywordID KeywordText 
1   Corporate 
2   Business 

否則,您需要按摩代碼中的數據。

+0

+1提供詳細信息。 – 2009-10-15 04:54:57

0

不知道如果MySql有這個,但SQL Server有一個RANK()在分區BY,你可以用它來爲每個結果分配一個等級......這樣可以讓你只選擇等級1的那些等級,並丟棄其餘的部分。

+0

我不確定,但它聽起來像孤兒的'花'吧?因爲不能保證最大的行將有其他行中出現的每個可能的關鍵字。如果可以的話,我希望每個結果都是1行 - 這是我喜歡關於group_concat的一件事。 – taber 2009-10-15 04:54:29

1

嗯,你的關鍵字需要在自己的表(每個關鍵字一個記錄)。然後你就可以做到這一點,因爲這些關鍵字將會正確地分組。

+0

+1。幾乎所有我想說的,以更簡潔的方式。 – David 2009-10-15 04:53:45

0

你有兩個選擇,因爲我看到它。

選項1:

更改你的方式存儲數據(在他們自己的表的關鍵字,使用許多一對多的關係,加入用關鍵字表中的現有表)。這將允許您使用DISTINCT。 DISTINCT目前無效,因爲查詢將「公司」和「公司,業務,策略」視爲兩個不同的值。

選項2:

寫一些'有趣的'sql來分割關鍵字字符串。我不知道MySQL有什麼限制,但是一般來說SQL並不是爲此設計的。