我有这张桌子:
+---------+----------+
+ 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
的值?
答案 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。这样做,您的搜索将会更快,更容易使用,并在将来保持良好状态。
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 |