2015-04-12 95 views
0

我想建立一个免费的婚姻网站,其中的主页拥有一个简单的窗体,一些文本框&下拉菜单和一个搜索按钮。如何制作高级搜索查询?

点击后,它将访问者带到另一个页面以及所有字段的查询字符串。

我用下面的存储过程来显示搜索结果。 参数:

cmd.Parameters.AddWithValue("@cat", cat); 
cmd.Parameters.AddWithValue("@subcat", subcat == "-1" ? "-1" : "," + subcat); 
cmd.Parameters.AddWithValue("@state", state); 
cmd.Parameters.AddWithValue("@city", city == "-1" ? "-1" : "," + city); 

ALTER PROCEDURE [dbo].[SearchGetAdPageWise] 
     ,@cat INT 
     ,@subcat NVARCHAR(10) 
     ,@state INT 
     ,@city NVARCHAR(10) 
    AS 

    BEGIN 
      SET NOCOUNT ON; 

SELECT ROW_NUMBER() OVER 
      ( 
        ORDER BY a.ad_type ASC,NEWID() 
      )AS RowNumber 
     ,a.Id 
     ,a.ad_title 
     ,b.Name a_state 
     ,a.ad_brief 
     ,a.ad_pic  
    INTO #Results 
    FROM [tbl_ads] a LEFT JOIN tbl_state b ON a.ad_state=b.Id 

WHERE ([email protected] OR a.ad_cat='-1' OR a.ad_cat='') 
AND ((a.ad_subcat LIKE N'%'[email protected]+'%' OR a.ad_subcat LIKE N'%'[email protected]) OR a.ad_subcat='-1' OR a.ad_subcat='') 
AND ([email protected] OR a.ad_state='-1' OR a.ad_state='') 
AND ((a.ad_city LIKE N'%'[email protected]+'%' OR a.ad_city LIKE N'%'[email protected]) OR a.ad_city='-1' OR a.ad_city='') 

问题是我坚持OR &和

,如果我使用或它就会出现很多不相关的结果。

如果我使用AND,那么如果任何搜索查询是空的。

对不起,我是新手,我的问题可能对您的朋友太幼稚了。

另一个问题,如果它的最好的&安全的方式来做到这一点?如果不是,那我该如何改进呢?

+0

看起来像逗号会导致一个问题,参数中的:“” + SUBCAT 。我认为这应该只是subcat,因为你将它与ad_subcat列的内容进行比较。 –

+0

@Mike在适当的地方使用表格的默认值。 – WorkSmarter

+0

{a.ad_subcat LIKE N'%'+ @ subcat +'%'或a.ad_subcat LIKE N'%'+ @ subcat} - 第二部分在这里是不必要的,它看起来应该由第一部分 – bf2020

回答

0

我不知道什么样的数据你需要过滤器,但我认为你可以尝试以下使用...OR @var = ''

WHERE ([email protected] OR a.ad_cat='-1' OR a.ad_cat='') 
AND ((a.ad_subcat LIKE N'%'[email protected]+'%' OR a.ad_subcat LIKE N'%'[email protected]) OR a.ad_subcat='-1' OR @subcat='') 
AND ([email protected] OR a.ad_state='-1' OR @state='') 
AND ((a.ad_city LIKE N'%'[email protected]+'%' OR a.ad_city LIKE N'%'[email protected]) OR a.ad_city='-1' OR @city='') 
+0

这是我对这个问题的完整描述[可选过滤](http://forums.asp .net/p/2044843/5892528.aspx?高级搜索+查询) – Mike

0

好吧,我搜索的逻辑是很难。如果我是你,我可能会尝试这样的事情。它应该总是返回的结果集数(在我的情况下,10行),更相关的结果将是第一位的

SELECT TOP 10 * --or any number of rows 
FROM 
(
    SELECT TOP 10 *,1 AS result_order 
    FROM yourTable 
    WHERE 1=1 AND 2=2 

    UNION ALL 

    SELECT TOP 10 *,2 AS result_order 
    FROM yourTable 
    WHERE 1=1 OR 2=2 
) 
ORDER BY result_order 
+0

这是我对这个问题的完整描述[可选过滤](http://forums.asp.net/p/2044843/5892528.aspx?Advanced +搜索+查询) – Mike