2011-08-24 30 views
1

我在mySQL中有一个查询,意思是返回在我们网站上使用的搜索词。是的,这是一个标签云,是的,我知道这是一个m鱼:)在子查询中转义%符号

我们有一个管理员页面,管理员可以查看搜索条件,并选择将它们排除在云中显示。这些词进入“badWords”表。我们已经得到了一些条款,如“foo%2525252525252520bar”,并且我们很难排除这些条款。

伪代码,查询到获得云搜索词是:

SELECT * FROM `searchTerms` WHERE `word` NOT IN (SELECT `word` FROM `badWords`) 

这工作得很好,除非从子查询返回的条件之一,它有一个%。有没有办法逃避整个子查询?我试过做

replace(SELECT `word` FROM `badWords`, '%', '\%') 

......但这显然不是语法正确。

我可以做两个查询,如果需要的话,但想知道是否有办法让它按原样完成。

谢谢!

==============================

UPDATE:关闭此就目前而言,我认为错误在别处。一旦我知道肯定会回来报告,但不希望人们浪费时间在这里回答这个问题,如果它不是正确的问题...

Upvoted迄今收到的两个回复。多谢你们。

==============================

更新2:叹息没关系......可以”牛逼关闭它:\

==============================

最后更新:嗯,看起来像转义价值不是问题。在添加到badWords表之前,管理页面会传递URL中的值。在通过URL传递值时,它会更改。因此,添加到badWords的内容实际上是“foo%25252525252520bar”(有一个更少的“25”序列)。如果我手动更新badWords中的值,并添加缺少的“25”,则按预期工作。所以没有必要替换或逃脱任何东西。我只需要适当修复这些URL值。

==============================

+0

你不能立即修改搜索条件吗?为什么那些关于'坏字'的大惊小怪? – glglgl

+0

@glglgl - 立即修改搜索条件是我计划研究的下一件事。目前,我想用现有数据修复现有的功能。 – charliegriefer

回答

2

我不是很好的与MySQL的语法,但SQL服务器让我们这样做这样说:

SELECT * FROM `searchTerms` WHERE `word` NOT IN (SELECT REPLACE(`word`, '%', '\%') FROM `badWords`) 

注:基本上我所做的就是将你的REPLACE在一些=)希望这有助于。

3

我不认为%是你的问题在这里。我认为你试图在子查询本身(SELECT ...)上使用REPLACE(),而不是在列值(word)上使用。试试这个:

SELECT * FROM `searchTerms` 
WHERE `word` NOT IN (
    SELECT REPLACE(`word`, '%', '\%') AS word FROM `badWords` 
); 

祝你好运!