mysql就像不是通配符

时间:2013-03-13 04:10:18

标签: php mysql

我有这张桌子:

+---------+----------+
+  Items  +  Person  +
+---------+----------+
+ 2,99,75 +  Jack    +
+ 4,9,63  +  Rose    +
+---------+----------+

现在我做一个简单的

LIKE :items

并使用

绑定它

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

,其中

$item = "%9%"

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

3 个答案:

答案 0 :(得分:2)

其他答案很好。但是,我根据Items似乎是ID的事实提出了这个替代方案。

如果你需要查询逗号分隔值,我会推荐一个单独的表。使用LIKE在单个字段中进行查询永远不会真正是万无一失,可能是一个安全问题。试试这个。

表1:人

+---------+----------+
+  ID     +  Person  +
+---------+----------+
+ <int>   + <string> +
+---------+----------+

表2:项目

+---------+----------+
+ PersonID+  ItemID  +
+---------+----------+
+ <int>   + <int>    +
+---------+----------+

然后根据需要使用连接来查询两个表。

SELECT * FROM Person INNER JOIN Items ON Items.PersonID = Person.ID 
   WHERE Items.ItemID = '9';

这应该为您提供Person中与ItemID“9”相关联的所有记录。

也许这可能会有所帮助:http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

答案 1 :(得分:1)

因为%代表一个或多个角色(任何东西)。所以99将匹配“%9%”

如果您只想要9,可以尝试使用

"%,9,%"

答案 2 :(得分:1)

我认为这方面的主要问题是@interrobang所说的,你表达数据的方式。

如果您显示的此表格X是每个人的列表,则您应该有一个包含人员ID的列和另一个包含项目ID的列,以及多行代表每个人的多个itens。这样做,您的搜索将会更快,更容易使用,并在将来保持良好状态。

SQL Fiddle

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);

查询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%'

<强> Results

| NAME |
--------
| John |