Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';如果括号中有很多值,那么(1,2,3,4…)条件下的mysql是否有效?_Mysql_Sql_Database_Denormalized - Fatal编程技术网

为什么';如果括号中有很多值,那么(1,2,3,4…)条件下的mysql是否有效?

为什么';如果括号中有很多值,那么(1,2,3,4…)条件下的mysql是否有效?,mysql,sql,database,denormalized,Mysql,Sql,Database,Denormalized,我正在一列中存储一个状态列表,这些状态以逗号分隔: 像这样:1,2,3,4,5,6,7,8。。等等,只要他们的身份证 然后,我执行一个查询,以获取具有ID为8的状态的所有行,并且当状态列表中只有很少的项时,该查询会起作用 这是查询和表: mysql> select id_partner, name, states from partner where 8 IN (states); +------------+----------------+--------------------+ |

我正在一列中存储一个状态列表,这些状态以逗号分隔:

像这样:1,2,3,4,5,6,7,8。。等等,只要他们的身份证

然后,我执行一个查询,以获取具有ID为8的状态的所有行,并且当状态列表中只有很少的项时,该查询会起作用

这是查询和表:

mysql> select id_partner, name, states from partner where 8 IN (states);
+------------+----------------+--------------------+
| id_partner | name           | states             |
+------------+----------------+--------------------+
|          1 | Inmo Inmo      | 8,9,10             |
|          2 | Foto Piso      | 8,9,10,11,12,13,14 |
|          4 | PARTNER 001-A  | 8                  |
|          6 | EnAlquiler     | 8                  |
|          7 | Habitaclia.com | 8,43,50            |
+------------+----------------+--------------------+
5 rows in set (0.00 sec)
如果列状态包含以逗号分隔的10个ID,则该列状态将起作用,但如果该列状态包含50个或更多ID,则该列状态将不再起作用。在上面的结果中,它不会显示具有许多状态的行,包括ID为8的行


有什么想法吗?我使用这种方法,不必创建另一个表来保存合作伙伴和状态之间的关系,或者我应该做得更好吗?

IN子句不是这样工作的——您需要使用在单个列中搜索逗号分隔的值:

SELECT *  
  FROM partner 
 WHERE FIND_IN_SET(8, states) > 0

实际上,您不应该存储逗号分隔的数据。它被称为非规范化数据,很难在逗号中获取有关特定值的信息。

您的字符串是单个值,而不是多个值。它碰巧包含逗号,但仍然是一个字符串

数字上下文中字符串的值取自前导数字。换句话说,“123456789”的数值是123。MySQL忽略超过第一个非数字的所有字符。(这是MySQL中的行为,其他数据库的行为可能不同)

()谓词中的
允许比较多个值,但必须使它们成为单独的SQL表达式。例如,在以下两个查询中,只有第一个查询返回任何内容:

SELECT * FROM partner WHERE 5 IN ( 1, 2, 3, 4, 5 );

SELECT * FROM partner WHERE 5 IN ( '1,2,3,4,5' );
这说明了为什么不应该使用带有逗号分隔元素的字符串,并期望它的行为像一个单独值的集合一样

在这种情况下,更好的设计是将给定伙伴的状态存储在另一个表中,其中伙伴和状态之间的每个关联都位于单独的行上

create table partner_states (
 id_partner int not null,
 id_state   int not null,
 primary key (id_partner, id_state)
);
然后填充它:

insert into partner_states (id_partner, id_state)
values (1, 8), (1, 9), (1, 10);
然后,您可以轻松查询符合特定状态的合作伙伴:

select id_partner, name, states 
from partner p join partner_states s on p.id_partner = s.id_partner
where s.id_state = 8
查询与外部联接的状态不匹配的合作伙伴:

select id_partner, name, states 
from partner p left outer join partner_states s on p.id_partner = s.id_partner
  and s.id_state = 8
where s.id_state is null

谢谢,它起作用了!:D我不知道这一点,所以IN条件仅在执行子查询时有效。对于不在(1,2,3..)中的WHERE字段,情况会如何?在集合中找不到?@Alexandru Trandafir Catalin:若要查找值是否不在CSV中,请使用:
WHERE FIND_IN_SET(8,states)=0
查找8不在CSV中的行。