2015-08-14 18 views
0

在MySQL數據庫從CSV場

CHILDREN 
|NAME |LIKES (LONGTEXT) 
|Sam |75 
|John |58,64,75 

FRUITS 
|ID |LABEL 
|58 |Apple 
|64 |Banana 
|75 |Cherry 

爲了獲得水果名兒童,我有以下IN選擇我做的:

> select * from fruits where id in 
(select LIKES from CHILDREN where name="Sam"); 
|ID |LABEL 
|75 |Cherry  

OK,但

> select * from fruits where id in 
(select LIKES from CHILDREN where name="John"); 
|ID |LABEL 
|58 |Apple 

我也試過以下結果相同:

> select * from fruits where id in ("58,64,75") 
|ID |LABEL 
|58 |Apple 
[Main Instruction] 
Your query produced 1 warnings. 
Warning: Truncated incorrect DOUBLE value: '58,64,75' 
[OK] 

>select * from fruits where id in (58,64,75) 
|ID |LABEL 
|58 |Apple 
|64 |Banana 
|75 |Cherry 

怎麼可能來解決這個問題不改變表定義,事情是這樣的...

+0

現在找什麼哇你喜歡混搭你不。 – Drew

+0

你需要什麼輸出結構? –

+0

如果你被困在桌子上,那是一回事。如果你設計了它們,你應該學會如何正確設計SQL表格。 –

回答

1

你所提到fix the problem WITOUT changing the tables definition的問題,存在對使用find_in_set功能的解決方案。但理想的解決方案是規範化數據,以避免逗號分隔數據存儲。從長遠來看,這會帶來更多的困難。所以你必須標準化表格。

但是使用find_in_set就可以實現你的

select 
f.* from FRUITS f 
join CHILREN c on find_in_set(f.ID,c.LIKES) > 0 
where c.NAME = 'John' 
+0

希望昏迷後不會有空格或0('SELECT FIND_IN_SET('12','1,2,120,012,12')'給出'0'),這是一個可以接受的解決方案! – Serge

+1

是的空間會搞砸,如果你認爲有空間可以替換它們'select FIND_IN_SET('12',replace('1,2,120,112,012,12','',''));' –