2016-09-21 35 views
0

我在我的网站上有一个数据网格,我从两张表中提取公司信息。使用UNION将数据拉入网格

我创建一个表单,基于3个滤波器(分类,州,市)

这些结果进行排序这是我的查询将数据加载到电网开始。我希望它填充将所有我的表数据直到用户决定过滤它,这就是为什么我使用UNION作为没有它我的查询正在等待我传递一个查询字符串值来完成它的WHERE语句。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 

UNION 

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = '[querystring:filter-Category]' OR  '[querystring:filter-Category]' is NULL) 

我不确定这是否是正确的操作。

我很难理解此查询的NULL参数。在页面加载时,没有查询字符串。

只有当用户按下“SORT”按钮时,才会将查询字符串添加到URL中。用户可以选择按1或全部3个过滤器进行排序,但在这种情况下,他们只能排序1个选项。查询字符串将为剩下的两个单独传递ALL。

IE:filter-Category/Barber%20Shop/filter-City/All/filter-State/All 这里用户只从1下拉菜单中选择'Barber Shop'并将City Drop32作为他们的下拉菜单默认选择。

我的查询是“侦听”查询字符串参数在我的应用程序上无法正常工作。但是,在SQL Management Studio中使用以下内容时,它会正确提取我的记录。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = 'Barber Shop' OR '[querystring:filter-Category]' is  NULL) 

这将是我的数据网格查询,包括所有3个“Listening”WHERE语句。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 

UNION 

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = '[querystring:filter-Category]' OR  '[querystring:filter-Category]' is NULL) 
AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS  NULL) 
AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS  NULL) 

任何帮助,输入,例子,洞察力高度赞赏!

例子在线& SQL工作室 enter image description here enter image description here enter image description here enter image description here

+0

显示您的结果从第一次选择和第二次选择。 –

+0

你好丹尼, 我已经添加了照片。 – UserSN

+0

什么是[querystring:filter-Category],sry idk那。是从HTML输入值? –

回答

1

联盟不会得到你想要的东西。它的目的是将2个或更多个查询的结果结合在一起,保持不同的值。在你的情况下,联盟的前半部分捕获所有数据,而后半部分捕获过滤后的数据。由于上半场抓住了所有人,所有人都得到了回报。

您似乎这样做是因为您没有用于第一次运行的过滤器,但是您希望在第二次运行时使用过滤器。

如果查询字符串不存在,请勿添加where子句。如果他们在场,请添加适当的地方和条款。

您提到了排序,但是您的查询缺少order by子句。 如果您想要对数据进行排序,您将需要添加一个。

1负载,没有WHERE子句或全部过滤器设置为 'ALL'

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
order by CategoryName, state, city 

后续加载,WHERE子句。

SELECT * FROM BND_listing left join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE (CategoryName = '[querystring:filter-Category]' OR  '[querystring:filter-Category]' is NULL) 
AND (city = '[querystring:filter-City]' OR '[querystring:filter-City]' IS  NULL) 
AND (state ='[querystring:filter-State]' OR '[querystring:filter-State]' IS  NULL) 
order by CategoryName, state, city 

编辑:你不能有2个查询,因为这个插件只允许1

我想通过“听”你的意思是查询字符串:过滤器类别将无论是在类别替代请求参数。由于它在您的查询中被替换,因此您无法将其与空值进行比较。由于没有过滤器是'全部',你需要考虑到这一点。 试试这个:

SELECT * 
FROM BND_listing 
left join BND_ListingCategories 
    on BND_Listing.CatID=BND_ListingCategories.CatID 
WHERE 
    (
     '[querystring:filter-Category]' = 'ALL' -- for when the queryString is set to ALL 
     or '[querystring:filter-Category]' = '' -- for when the queryString isn't available like first load. this replaces the is null comparison. you can't compare a string literal to null as they are wrapped in quotes 
     or CategoryName = '[querystring:filter-Category]' -- this is the comparison to your column 
    ) 
    AND (
     '[querystring:filter-City]' = 'ALL' 
     or '[querystring:filter-City]' = '' 
     or city = '[querystring:filter-City]' 
    ) 
    AND (
     '[querystring:filter-State]' = 'ALL' 
     or '[querystring:filter-State]' = '' 
     or state = '[querystring:filter-State]' 
    ) 
order by CategoryName, state, city 
+0

感谢您回复@serverSentinel,我无法做2个单独的查询我的电网插件只有一个。有没有办法可以将两个查询结合起来,以便第一次加载第一个查询,第二次加载在后台等待查询字符串? 对于排序我的意思只是用户从我的下拉菜单中选择一个字段的操作,输入查询字符串只提取匹配字段。不是SQL中的实际SORT。 – UserSN

+0

我编辑了答案。在这个例子中,你不能比较为null,因为当你的网格插件在查询中进行搜索和替换时,它将替换引号内的部分(...或者''为空),这从来都不是真的。 (...或“=”)将是真实的。 – serverSentinel

+0

我会尝试在@serverSentinel中暂时插入这个我刚刚在这个重定向的前面添加了另一个页面,它总是将至少ALL添加到我的查询字符串中。 – UserSN

0

谢谢所有帮助&例子。我能够让我的查询排序,事实上,我有一个需要首先解决的网格问题。

select * FROM BND_listing right join BND_ListingCategories 
on BND_Listing.CatID=BND_ListingCategories.CatID 
where 
(CategoryName = '[querystring:filter-Category]' or '[querystring:filter- Category]'='All') 
and 
(City = '[querystring:filter-City]' or '[querystring:filter-City]'='All') 
and 
(Region= '[querystring:filter-State]' or '[querystring:filter-State]'='All') 
and 
(Country= '[querystring:filter-Country]' or '[querystring:filter- Country]'='All') 

我只是有一个页面重定向,总是为所有我的网格填充我的查询字符串过滤器至少传递一个ALL值。