2016-12-08 130 views
0

我有一個表,看起來像這樣:MySQL的GROUP BY FIND_IN_SET

| sport  | name 
|-----------|------- 
| kitesurf | john 
| kitesurf | mike 
| kitesurf | tobi 
| tennis | tobi 
| tennis | bob 
| skate  | mat 
| surf  | mat 

是它無論如何:

|id | name | sport   | 
|---|------|------------------| 
|1 | john | kitesurf   | 
|2 | mike | kitesurf   | 
|3 | tobi | tennis, kitesurf | 
|4 | mat | surf, skate  | 
|5 | bob | tennis   | 

我怎樣才能通過運動,將看起來像這樣得到與團體名單隻使用MySQL可行嗎? 感謝您的任何提示:)

+0

MySQL沒有任何內置的功能分裂的字符串。您不應使用逗號分隔的列表,請使用多對多關係表。 – Barmar

回答

2

您需要另一個表格列出每個不同的運動。

CREATE TABLE Sports (sport VARCHAR(10) PRIMARY KEY); 
INSERT INTO Sports (sport) VALUES ('kitesurf'), ('tennis'), ('skate'), ('surf'); 

然後你就可以加入這樣:

SELECT s.sport, n.name 
FROM NoOneNamesTheirTableInSqlQuestions AS n 
INNER JOIN Sports AS s ON FIND_IN_SET(s.sport, n.sport); 

但是,這是低效的查詢,因爲FIND_IN_SET()不能使用索引。

另見我的回答Is storing a delimited list in a database column really that bad?

+0

非常感謝你@Bill。我明白自己的錯誤,將來會避免使用逗號分隔值。但是有一個子問題:爲什麼如果CSV非常糟糕,爲什麼MySQL列有「set」類型? –

+0

我猜想MySQL的一些客戶支付他們來實現它。對於他們的具體項目來說,這可能是最差的解決方案。請注意,您不能使用索引來搜索「SET」數據類型中的特定值。如果你不需要在集合中搜索一個值,它可以是一種緊湊的方式來存儲一系列選項。 –