这是一个非常奇怪的问题,它的用处可能仅限于我的问题;我要解释我在问什么以及为什么需要它。
我的问题:
我有一张桌子,比方说有两列,以下一张桌子为例:
id|value
1 A
2 B
3 C
4 A
5 A
现在,如果我执行“SELECT id WHERE value ='A',我会得到3个结果,1,4,5。如果我执行”SELECT id WHERE value ='B',我会得到1个结果,2。依此类推,如果有更多的条目,我会根据我在查询中查找的值得到相应的行数作为我的结果。都很好。
但现在,我的问题出现了。假设我想为每个查询获取每一行,但是有下一个限制:
请勿修改查询。
如果我做“SELECT id WHERE value ='A'”,我会得到每个id,如果我做“SELECT id WHERE value ='B'”,我会得到每个id,依此类推。
“但如果我无法修改我的查询,那么我该怎么办?”您可能会问,好吧,您可以修改表格,例如将列“值”的值更改为与每个值匹配的值,这是一个通配符,因此问题的标题,但我很确定是否我将所有'值'值更新为'%',它不起作用(我试过知道这不起作用,但仍然,我不能失去任何尝试)。
所以,你可以做任何你想做的事,唯一的限制是不修改查询。
我知道这与数据库和表格应该如何工作相反,但这是我遇到过的一个问题,也许这是不可能的,但也许不是。
修改
我知道这根本没有任何意义,但我认为这是一种挑战,吸引那些创意人士。不要担心漏洞或其他任何问题,只要问问自己:“我该怎么做?”
答案 0 :(得分:2)
在我提出任何解决方案之前,请允许我明确指出 您正在解决错误的问题 。你应该弄清楚如何改变你的疑问;这种限制将继续产生更多问题。解决这个问题的任何方法都会非常复杂,会产生更多问题。
希望这真的只是一种智力练习。
我也只是要草拟如何做到这一点,因为这只是一项智力锻炼吗?!
第一个也是最全面的解决方案是"只是"更改MySQL数据库的源代码以响应您喜欢的查询。它是一个开源数据库。下载源代码,进行更改,重新编译和安装。
此解决方案的缺点(假设您可以使其工作)是它影响到数据库的每个连接,并且每次要升级MySQL时都必须重复。
假设这仅限于一个表,并且WHERE子句的集合是固定的 ,您可以复制该表中的每一行以包含可能存在的每个值查询。例如,如果你有id 1和2且值只有A,B或C,你就可以制作一个这样的表:
id|value
1 A
1 B
1 C
2 A
2 B
2 C
然后,您可以执行各种中间人攻击来剥离WHERE子句。如果它是一组固定的程序,那么您可以更改它们使用的数据库API库。在Perl中,这将是DBI库。在PHP中,这将是mysqli或PDO。等等。
更全面的解决方案是用您自己的小服务器替换MySQL服务器的套接字(TCP和Unix套接字)。这将读取并解析MySQL网络协议(您可以从MySQL源中提取代码来执行此操作),更改查询以剥离WHERE子句,并将其发送到真正的MySQL服务器。
这些都是非常难以正确实施的可怕解决方案。即使你让他们100%工作,你也会留下一个对数据库查询做出奇怪事情的系统,这可能会导致进一步的问题。
解决问题的最有创意的解决方案之一就是意识到您正在解决错误的问题 。
我鼓励你发布导致这个问题的情况,作为另一个问题,因为那是真正的问题。导致它的管理失败也将成为一个很好的火车残骸。