Php mysql不喜欢通配符

Php mysql不喜欢通配符,php,mysql,Php,Mysql,我有这张桌子: +---------+----------+ + Items + Person + +---------+----------+ + 2,99,75 + Jack + + 4,9,63 + Rose + +---------+----------+ 现在我做一个简单的 LIKE:items 并使用 $stmt->bindParam(':items',$item,PDO::PARAM_STR) 在哪里 $item=“%9%” 结果同时包含Jack和Ros

我有这张桌子:

+---------+----------+
+  Items  +  Person  +
+---------+----------+
+ 2,99,75 +  Jack    +
+ 4,9,63  +  Rose    +
+---------+----------+
现在我做一个简单的

LIKE:items

并使用

$stmt->bindParam(':items',$item,PDO::PARAM_STR)

在哪里

$item=“%9%”


结果同时包含JackRose,这是错误的,因为我希望只有Rose作为我的结果。似乎
LIKE
同时看到99和9。如何将我的
LIKE
限制为只有9个,因为这是
$items
的值?

它的%表示一个或多个字符(任何字符)。因此99将匹配“%9%”

如果你只想要9个,你可以试试

"%,9,%"

这是因为%表示一个或多个字符(任何字符)。因此99将匹配“%9%”

如果你只想要9个,你可以试试

"%,9,%"

我认为这方面的主要问题是@interrobang所说的,即您表示数据的方式

如果您显示的这个表X是每个人的ITEN列表,那么您应该有一个带有person id的列和另一个带有item id的列,以及多行来表示每个人的多个ITEN。这样做,你的搜索将更快,更容易使用和曼坦在未来

MySQL 5.5.30架构设置

CREATE TABLE person (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE item (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE person_item (
     id int auto_increment primary key, 
     person_id int,
     item_id int
);

ALTER TABLE person_item ADD UNIQUE (person_id,item_id);

INSERT INTO person(id,name) VALUES
(1, 'John'),
(2, 'Mary'),
(3, 'Oliver');


INSERT INTO item (id,name) VALUES
(1,'Pen'),
(2,'Pencil'),
(3,'Book');

INSERT INTO person_item (person_id,item_id) VALUES
(1,1),
(1,3),
(2,2),
(3,1);
select p.name from person_item pi, person p, item i
where pi.person_id = p.id
and pi.item_id = i.id
and i.name LIKE 'Book%'
| NAME |
--------
| John |
查询1

CREATE TABLE person (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE item (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE person_item (
     id int auto_increment primary key, 
     person_id int,
     item_id int
);

ALTER TABLE person_item ADD UNIQUE (person_id,item_id);

INSERT INTO person(id,name) VALUES
(1, 'John'),
(2, 'Mary'),
(3, 'Oliver');


INSERT INTO item (id,name) VALUES
(1,'Pen'),
(2,'Pencil'),
(3,'Book');

INSERT INTO person_item (person_id,item_id) VALUES
(1,1),
(1,3),
(2,2),
(3,1);
select p.name from person_item pi, person p, item i
where pi.person_id = p.id
and pi.item_id = i.id
and i.name LIKE 'Book%'
| NAME |
--------
| John |

CREATE TABLE person (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE item (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE person_item (
     id int auto_increment primary key, 
     person_id int,
     item_id int
);

ALTER TABLE person_item ADD UNIQUE (person_id,item_id);

INSERT INTO person(id,name) VALUES
(1, 'John'),
(2, 'Mary'),
(3, 'Oliver');


INSERT INTO item (id,name) VALUES
(1,'Pen'),
(2,'Pencil'),
(3,'Book');

INSERT INTO person_item (person_id,item_id) VALUES
(1,1),
(1,3),
(2,2),
(3,1);
select p.name from person_item pi, person p, item i
where pi.person_id = p.id
and pi.item_id = i.id
and i.name LIKE 'Book%'
| NAME |
--------
| John |

我认为这方面的主要问题是@interrobang所说的,即您表示数据的方式

如果您显示的这个表X是每个人的ITEN列表,那么您应该有一个带有person id的列和另一个带有item id的列,以及多行来表示每个人的多个ITEN。这样做,你的搜索将更快,更容易使用和曼坦在未来

MySQL 5.5.30架构设置

CREATE TABLE person (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE item (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE person_item (
     id int auto_increment primary key, 
     person_id int,
     item_id int
);

ALTER TABLE person_item ADD UNIQUE (person_id,item_id);

INSERT INTO person(id,name) VALUES
(1, 'John'),
(2, 'Mary'),
(3, 'Oliver');


INSERT INTO item (id,name) VALUES
(1,'Pen'),
(2,'Pencil'),
(3,'Book');

INSERT INTO person_item (person_id,item_id) VALUES
(1,1),
(1,3),
(2,2),
(3,1);
select p.name from person_item pi, person p, item i
where pi.person_id = p.id
and pi.item_id = i.id
and i.name LIKE 'Book%'
| NAME |
--------
| John |
查询1

CREATE TABLE person (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE item (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE person_item (
     id int auto_increment primary key, 
     person_id int,
     item_id int
);

ALTER TABLE person_item ADD UNIQUE (person_id,item_id);

INSERT INTO person(id,name) VALUES
(1, 'John'),
(2, 'Mary'),
(3, 'Oliver');


INSERT INTO item (id,name) VALUES
(1,'Pen'),
(2,'Pencil'),
(3,'Book');

INSERT INTO person_item (person_id,item_id) VALUES
(1,1),
(1,3),
(2,2),
(3,1);
select p.name from person_item pi, person p, item i
where pi.person_id = p.id
and pi.item_id = i.id
and i.name LIKE 'Book%'
| NAME |
--------
| John |

CREATE TABLE person (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE item (
     id int auto_increment primary key, 
     name varchar(20)
);

CREATE TABLE person_item (
     id int auto_increment primary key, 
     person_id int,
     item_id int
);

ALTER TABLE person_item ADD UNIQUE (person_id,item_id);

INSERT INTO person(id,name) VALUES
(1, 'John'),
(2, 'Mary'),
(3, 'Oliver');


INSERT INTO item (id,name) VALUES
(1,'Pen'),
(2,'Pencil'),
(3,'Book');

INSERT INTO person_item (person_id,item_id) VALUES
(1,1),
(1,3),
(2,2),
(3,1);
select p.name from person_item pi, person p, item i
where pi.person_id = p.id
and pi.item_id = i.id
and i.name LIKE 'Book%'
| NAME |
--------
| John |

其他答案很好。然而,我提出这个替代方案是基于这样一个事实,即项目似乎是ID的

如果需要查询逗号分隔的值,我建议使用单独的表。在单个字段中使用LIKE-to-query永远不会是真正的傻瓜式的,而且可能会带来安全问题。试试这个

表1:人

+---------+----------+
+  ID     +  Person  +
+---------+----------+
+ <int>   + <string> +
+---------+----------+
这将为您提供
Person
中与
ItemID
“9”关联的每条记录


也许这会有所帮助:

其他答案也不错。然而,我提出这个替代方案是基于这样一个事实,即项目似乎是ID的

如果需要查询逗号分隔的值,我建议使用单独的表。在单个字段中使用LIKE-to-query永远不会是真正的傻瓜式的,而且可能会带来安全问题。试试这个

表1:人

+---------+----------+
+  ID     +  Person  +
+---------+----------+
+ <int>   + <string> +
+---------+----------+
这将为您提供
Person
中与
ItemID
“9”关联的每条记录



也许这会有所帮助:

虽然我知道您可能无法更改数据库的架构,但这从根本上说是表示此类数据的错误方法。因为%表示一个或多个字符(任何字符)。那么99将匹配“%9%”@Interrobang,这是什么意思?数据库在允许您映射数据之间的关系方面非常棒。为了做好他们的工作,他们使用了某些结构——即行和列的概念。每列只应包含一个数据元素,其形式最适合该元素。(Postgres中也有类似JSON的例外,但语义不同)因此,您应该真正以一对多的方式表示这些用户与其id之间的关系,其中一个用户可能有多行数据,每行数据都有一个整数id。然后查找拥有项目9的用户就像“从tbl中选择*,其中项目=9”一样简单@类
如“%”,9,%%
将在
8,9
9,8
或任何其他示例中失败,其中9位于开头或结尾虽然我知道您可能无法更改数据库的架构,但这基本上是表示此类数据的错误方式。因为%表示一个或多个字符(任何字符)。那么99将匹配“%9%”@Interrobang,这是什么意思?数据库在允许您映射数据之间的关系方面非常棒。为了做好他们的工作,他们使用了某些结构——即行和列的概念。每列只应包含一个数据元素,其形式最适合该元素。(Postgres中也有类似JSON的例外,但语义不同)因此,您应该真正以一对多的方式表示这些用户与其id之间的关系,其中一个用户可能有多行数据,每行数据都有一个整数id。然后查找拥有项目9的用户就像“从tbl中选择*,其中项目=9”一样简单@类
如“%”,9,%%
将在
8,9
9,8
上失败,或在9位于开始或结束位置的任何其他示例中失败。这不会适用于所有情况,例如“9,1,2”或“43,56,9”。您必须添加
或左侧(项目2)='9',或右侧(项目2)='9'
。然而,这并不是问题的解决办法。这只会让他更深地陷入糟糕的代码中。对回答错误和没有帮助OP建立正确的数据库进行否决投票。事实上,用户应该重新进行数据库设计(并使用表之间的关系),但这不是直接的问题。我不是在挖苦他,只是解释一下
%
的行为。投你想要的一票,伙计。别在意,你的回答仍然不能解决OP的问题。你错过了我上面提到的两个案例。教他LIKE如何工作,而不解决问题,也不教他任何有关数据库设计的有用知识,这是一件很好的工作。这不是问题所在。问题中没有提到
9、%%
%,9
,我的示例只是解释类似的工作原理。你已经投了反对票,所以请不要再烦我了。这不适用于所有情况,例如“9,1,2”或“43,56,9”。游沃