我有一个连接到mysql数据库的java程序。我要做的是获取用户输入并显示与用户输入匹配的列。该列包含编程语言列表。我需要sql查询方面的帮助。例如,如果第一行中的列包含javascript、c++、c#,第二行中的列包含java,并且如果我使用了查询
"SELECT * from Language WHERE Programming Languages LIKE'%"+input.getText()+"%'")
如果用户搜索java,那么表将显示包含java和javascript的列,因为它包含单词java。如果有第三行,并且该列有c,如果用户要搜索c,那么它将显示包含c++和c的列。
我试着用这个正则表达式来代替
`"SELECT * from Language WHERE Programming Language REGEXP'[[<:]]"+input.getText()+"[[:>:]]'")`
它解决了java和javascript问题,但是搜索c将显示带有c#和c的列。同时,搜索c#将不显示任何内容,搜索c将使此错误重复运算符操作数无效。我的table
表的列数据:
Javascript HTML CSS PHP
C# Java
C
C++ C#
在第一个查询中,我试图在%前面加一个空格,这个空格用于区分。我现在的问题是如何在一列中搜索多个单词,上面的查询按确切的顺序处理两个或三个输入。搜索javascript和html会显示出来,但是javascript和css不会显示,因为它不符合顺序
3条答案
按热度按时间nx7onnlm1#
下面是一种执行查询的方法。这是从这篇文章衍生出来的。
这需要一个临时表,其中的行数由数字填充,最多可包含最大的标记数(用空格分隔的语言字符串,例如字符串“javascript html css php”有4个标记)。
创建带有数字的临时表:
包含编程语言字符串列的表:
插入一些测试数据:
查询:
此选择与输入字符串“c”完全匹配;
结果是:
vhipe2zx2#
这里的问题是数据库模型没有正确规范化。虽然可能,但不建议在数据库的一列中存储多个值。相反,作为第一步,使用单独的数据库存储编程语言,并使用唯一索引将值Map到人员:
.
现在您只需在表语言中搜索相应的语言,并使用join子句将其Map到用户:
但是,仍然有优化的空间:现在在languages表中,每种编程语言都有多个条目。例如,如果您不小心在同一语言的一个条目中输入了一个错别字,那么这需要更长的搜索时间,并且有可能导致数据库不一致。为了避免所有这些,我们可以引入第三个表,每个语言只包含一个条目,然后将第二个表重新构造为一个Map:
.
.
通过向查询引入另一个联接,您仍然可以查询表并将语言连接到usery:
现在,每种语言只有一个条目,您可以轻松地搜索每种语言并获取所有Map用户,还可以添加单独的新语言或Map,而无需修改users表。
这是数据模型的规范化形式。
zaqlnxep3#
让我猜猜,您将所有开发人员存储到一个表中,其中一列存储此开发人员掌握的语言。
当有人输入一种语言时,你想搜索所有掌握这种语言的开发人员吗?
如果是这样的话,我会这样做,在你的语言栏,在你的语言栏,在末尾加一个额外的空格(使用
_
如下空白)然后在java代码中,可以使用以下代码来实现这一点。
请注意不要在java代码中连接sql字符串。你可以这样做: