2014-01-18 44 views
0

我看到很多类似的问题,我怎么找不到我的答案。这笔交易。我有两张桌子。我试图找到一种方法来将文本数组插入到子句中。MySQL中子句字符串到数组

table.list table.user 
+--------+ +--------+ 
|id|list | |id|name | 
+--+-----+ +--+-----+ 
| 1|1,2,3| | 1|jack | 
+--+-----+ +--+-----+ 
| 2|6,8 | | 2|john | 
+--+-----+ +--+-----+ 
       | 3|jane | 
       +--+-----+ 
       | 6|jim | 
       +--+-----+ 
       | 8|jade | 
       +--+-----+ 

这是我可爱的一段in-clause代码。

SELECT (SELECT GROUP_CONCAT(user.name) 
      FROM user WHERE user.id in (list.list) 
     ) 
FROM list; 

我的问题是有什么办法将list.list转换为数组。我知道区别。通常它应该像(1,2,3)或('1','2','3'),但现在我有('1,2,3')。有任何想法吗。

回答

2

SQL Fiddle

MySQL的32年5月5日架构设置

CREATE TABLE list 
    (`id` int, `list` varchar(5)) 
; 

INSERT INTO list 
    (`id`, `list`) 
VALUES 
    (1, '1,2,3'), 
    (2, '6,8') 
; 

CREATE TABLE user 
    (`id` int, `name` varchar(4)) 
; 

INSERT INTO user 
    (`id`, `name`) 
VALUES 
    (1, 'jack'), 
    (2, 'john'), 
    (3, 'jane'), 
    (6, 'jim'), 
    (8, 'jade') 
; 

查询1

SELECT (SELECT GROUP_CONCAT(user.name) 
FROM user WHERE instr(concat(' ,',list.list,','),concat(',',user.id,',')) > 1 
) 
FROM list 

Results

jack,john,jane 
jim,jade 
2

您应该添加另一个表以创建list.iduser.id之间的链接。在数据库中使用逗号分隔的列表不是一个好主意。它们非常难以操作,并且比加入索引元组要慢得多。

如果用户只能存在于一个列表中,那么最好将其他列添加到user。否则,如果用户可以存在于多个列表中,那么您将使用类似下面的内容。

list user   user_to_list 
+--+ +--------+ +---------------+ 
|id| |id|name | | userId|listId | 
+--+ +--+-----+ +-------+-------+ 
| 1| | 1|jack | |  1|1  | 
+--+ +--+-----+ |  2|1  | 
| 2| | 2|john | |  3|1  |  
+--+ +--+-----+ |  6|2  | 
     | 3|jane | |  8|2  | 
     +--+-----+ +-------+-------+ 
     | 6|jim | 
     +--+-----+ 
     | 8|jade | 
     +--+-----+ 

您还可以阅读有关维基百科上的数据库规范化(http://en.wikipedia.org/wiki/Database_normalization)的更多信息。