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