1

我正在尝试在 Windows 上的 Mysql Server 5.1 中做一些事情。

我很肯定这种类型的查询在旧版本的 Mysql 中工作,因为我之前将它提供给客户端没有问题。

基本上,我的一个表中的一个字段包含几个 id;如 1,2,3,4,5

该字段的类型为 varchar

我试图通过使用 IN 语句来查看字段中是否存在值,如下所示。但它什么也不返回。

我究竟做错了什么?有没有更好的办法?谢谢。

mysql> create database testing;
Query OK, 1 row affected (0.00 sec)

mysql> use testing;
Database changed
mysql> create table table1(field1 char(20));
Query OK, 0 rows affected (0.01 sec)

mysql> create table table2(field2 char(20));
Query OK, 0 rows affected (0.00 sec)

mysql> insert into table1 values('1');
Query OK, 1 row affected (0.00 sec)

mysql> insert into table2 values('1,2,3');
Query OK, 1 row affected (0.00 sec)

mysql> select * from table1 where field1 in (select field2 from table2);
Empty set (0.00 sec)
4

2 回答 2

1
insert into table2 values('1,2,3');

很可能需要

insert into table2 values('1');
insert into table2 values('2');
insert into table2 values('3');

然后,您的子选择select field2 from table2返回('1', '2', '3'),并且该IN运算符可用于检查主选择的相应字段的结果是否包含在此集合中。


根据评论,相同的模式似乎以前也有效。我不知道IN可以像在问题中那样使用运算符,并且将列值拆分为行集似乎并非易事。

使用FIND_IN_SET()@KaeL 提出的功能,以下查询应该可以工作:

SELECT b.*
FROM table2 a
INNER JOIN table1 b ON FIND_IN_SET(b.field1, a.field2) > 0;

也可以看看


在任何情况下,您都应该考虑规范化您的模式 - 当单独的值存储在单独表的单独行中时,关系数据库通常可以更好地处理使用字符串列表作为单个字段的值。

http://sqlfiddle.com/#!2/797cc/3显示了一个可能的解决方案。

于 2013-06-14T10:06:55.707 回答
1

从您的查询select * from table1 where field1 in (select field2 from table2);中,我想象的是这样的:

剖析子查询select field2 from table2,您将拥有:

field2
'1,2,3'

然后主要查询将是(替换):

select * from table1 where field1 in ('1,2,3');

显然它不会返回任何行,因为唯一的值table1.field1'1'. 和'1' <> '1,2,3'

好吧,我打赌你正在寻找这个:FIND_IN_SET

示例查询:

SELECT FIND_IN_SET('1', '1,2,3');将返回1

于 2013-06-14T10:16:50.317 回答