2012-02-02 109 views
2

我不会说英语。 我使用谷歌翻译。IN(选择.....)MYSQL

(`id` int(11) NOT NULL AUTO_INCREMENT,) 
(`members` text NOT NULL) 

我有以下查询:

SELECT members FROM team WHERE id = 37 

结果是:25,36,38,87工作完美

,我有这等查询:

SELECT * 
FROM users 
WHERE id_users IN (25,36,38,87) 

完美工作

但这不起作用

SELECT * 
FROM users 
WHERE id_users IN (SELECT members FROM team WHERE id = 37 ) 

我不得不用PHP修复:

SELECT * FROM users WHERE id_users IN ($members) 

非常感谢大家。再一次,我的英语很抱歉。我用谷歌翻译。非常好的网站

新增从评论的模式:

CREATE TABLE IF NOT EXISTS team ( 
    id int(11) NOT NULL AUTO_INCREMENT, 
    members text NOT NULL, 
    PRIMARY KEY (id) 
) 

CREATE TABLE IF NOT EXISTS users ( 
    id_users int(11) NOT NULL AUTO_INCREMENT, 
    name varchar(100) CHARACTER SET latin1 NOT NULL, 
    PRIMARY KEY (id_usuario) 
) 
+0

每个表的属性是什么?如果您使用'id'而不是'id_users',那会起作用吗? – TheDude 2012-02-02 05:44:55

+0

CREATE TABLE IF NOT EXISTS'team'( 'id' INT(11)NOT NULL AUTO_INCREMENT, 'members'文本NOT NULL, PRIMARY KEY('id') ) CREATE TABLE IF NOT EXISTS (用户)( 'id_users' int(11)NOT NULL AUTO_INCREMENT, 'name' varchar(100)CHARACTER SET latin1 NOT NULL, PRIMARY KEY('id_usuario') ) – 2012-02-02 05:51:00

回答

0

我不知道,但我觉得你的id_users可以在不同类型的membersteammembers在文本中,但不是int。

+0

如何解决这个问题? – 2012-02-02 05:58:19

+0

原谅我的英语。 我不会说英语。 如果我不明白。 – 2012-02-02 06:01:46

+0

通常,我在VB中使用'Split(...)'将文本'members'制作成一个数组。我不知道如何直接在SQL中分割它。抱歉。 – shk3 2012-02-02 06:01:51

0

成员是一个文本字段,id_users是一个int。它们是不同的类型

+0

成员为文本 ,因为它在数字之间有一个逗号(,) – 2012-02-02 05:57:41

+0

成员是文本字段。如果您使用IN,则必须提供一个集合,而不是文本字段。仅仅因为它以逗号显示并不意味着它将被视为一组。因此,对于您例如,如果成员为“12,13,14”,查询将是:在“12,13,14” – TheDude 2012-02-02 06:02:48

+0

id_users我不得不用PHP修复 SELECT * \t \t来自用户的 WHERE id_users IN($ members) 非常感谢大家。 再次,对不起我的英语。 我使用谷歌翻译。 非常好的网站 – 2012-02-02 06:21:25

1

您应该修复您的架构以使用关联表而不是CSV列。

在此同时,您可以使用find_in_set,这样的事情应该工作:

select u.* 
from users u 
join team t on find_in_set(u.id, t.members) 
where t.id = 37 

但你真的应该解决您的架构,一个CSV栏肯定是一个SQL反模式和只会带来麻烦。