我目前正在尝试通过使用ASP.net和MYSQL创建的网站创建“搜索引擎”,我对两者都很新,我遇到了这个问题。我创建了一个用户输入页面,以便他们可以通过键入一个或所有不同的搜索字段进行搜索。 (制作,模型,颜色,..等。)根据用户提供的这些信息,根据输入的字段创建SQL子查询进行搜索的最佳方法是什么。我环顾四周,看到了很多解决方案只写一个UNION调用,其中一个param是NULL,但我宁愿不做8!获取所有可能性所需的SQL查询。如果有人有一个非常感谢的建议。
答案 0 :(得分:1)
没有看到架构,我们无法肯定地说,但我不相信你需要一个子查询。搜索可以通过强制用户通过下拉列表选择品牌,模型等来工作。在这种情况下,您需要的是基于所选标准的一系列AND语句:
Select ...
From MyTable
Where Make = @Make
And Model = @Model
...
您将根据用户提出的参数(不包括未指定的参数)在C#代码中构建此SQL语句。即,如果用户没有选择模型,则不会包含该And语句。
您的SQL汇编代码可能类似于
private function Search( string make, string model, ... )
{
var sql = new StringBuilder();
sql.AppendLine( "Select .... " );
sql.AppendLine( "From MyTable" );
sql.AppendLine( "Where 1=1" ); //this is just to add the Where keyword
var parameters = List<DbParameter>();
if ( !string.IsNullOrEmpty( make ) )
{
sql.AppendLine( " And Make = @Make " );
parameters.AddWithValue( "@Make", make );
}
if ( !string.IsNullOrEmpty( model ) )
{
sql.AppendLine( " And Model = @Model " );
parameters.AddWithValue( "@Model", model );
}
...
}
另一个方法是简单地构建检查空值的整个SQL语句:
var sql = new StringBuilder();
sql.AppendLine( "Select .... " );
sql.AppendLine( "From MyTable" );
sql.AppendLine( "Where ( @Make Is Null Or Make = @Make" )
sql.AppendLine( " And ( @Model Is Null Or Model = @Model" )
...