1

我有这张桌子:

+---------+----------+
+  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

4

3 回答 3

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

这应该为您提供与它们关联的“9”的每条Person记录ItemID

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

于 2013-03-13T04:26:42.857 回答
1

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

如果您显示的此表 X 是每个人的列表项,则您应该有一个带有人员 ID 的列和另一个带有项目 ID 的列,以及多行来表示每个人的多个条目。这样做,您的搜索将在未来更快、更容易使用和维护。

SQL小提琴

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

结果

| NAME |
--------
| John |
于 2013-03-13T04:17:57.007 回答
1

这是因为 % 代表一个或多个字符(任何东西)。所以 99 将匹配 "%9%"

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

"%,9,%"
于 2013-03-13T04:13:35.150 回答