我试图找出一种方法来做一个“anagram”函数作为MySQL上的存储过程。假设我有一个包含字典中所有单词的数据库 - 我想将一些字母的参数输入为VARCHAR,并返回组成这些字母的字谜的单词列表。
我想我的意思是,我如何运行一个SQL命令来说“选择与参数长度相同的所有单词并且包含参数中的每个字母”。
我已经探索了可用的字符串函数(http://www.hscripts.com/tutorials/mysql/string-function.php)。我确信这些可以以某种方式结合使用,但是当它变得复杂时无法正确地使用语法。
我是SQL的新手,看起来可用的String函数非常有限。任何帮助将不胜感激:)
答案 0 :(得分:2)
你没有;要求关系数据库做这件事并不明智。
然而,如果有人在枪口下强迫我使用关系数据库实现anagram发现,我会像这样反规范化:
word | sorted
-----|-------
bar | abr
bra | abr
keel | eekl
leek | eekl
其中“已排序”由“单词”中的所有字母组成,使用您喜欢的任何规则进行排序,只要它是一个总订单。您可以使用其他而不是SQL来计算该部分。
然后你可以找到类似这样的字谜:
SELECT w2.word AS anagram
FROM words w1
JOIN words w2 ON w1.sorted=w2.sorted
WHERE w1.word = 'leek'
AND w2.word <> w1.word
答案 1 :(得分:0)
SQL可能不适合这样做,你应该在前端做。
首先考虑anagram的属性,它与字典中的单词长度相同。您可以从检索这些单词开始。
不考虑使用数组创建每个字母的变量 每个字母映射到索引(a = 0,b = 3等)。每次遇到那个字母都会增加该存储桶的值,所以对于单词“dad”,你最终得到的结构如下:
arr[0]=1, arr[1]=0, arr[2]=0, arr[3]=2, arr[4]=0
等等......
现在你可以看看你的单词是否与数组中的每个项目相匹配。
虽然在SQL中并非不可能,但您可以在数据库中表示这种逻辑,例如,另一个将引用字典单词并且每个元组都是数组的表,然后您可以只检索所有项目相同的价值观。