我的网站上有一个数据网格,我从2个表中提取公司信息。
我创建了一个表单,根据3个过滤器(类别,州,城市)对这些结果进行排序
这是我最初将数据加载到网格中的查询。我希望它填充所有我的表数据UNTIL用户决定过滤它,这就是为什么我使用UNION没有它我的查询等待我传递查询字符串值来完成它#s; s 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 在这里,用户只选择' Barber Shop'从1下拉并离开城市&状态下降作为默认选择。
我的查询是"听"查询字符串参数在我的应用程序上无法正常工作。但是,在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"倾听"的数据网格查询。包括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)
任何帮助,输入,示例,洞察力都非常感谢!
答案 0 :(得分:1)
联盟不会为你提供你想要的东西。它的目的是将两个或多个查询的结果连接在一起,保持不同的值。在您的情况下,联合的前半部分捕获所有数据,后半部分捕获过滤的数据。由于上半部分全部捕获,所有返回。
您似乎是这样做的,因为您没有第一次运行的过滤器,但您希望第二次运行时使用过滤器。
如果查询字符串不存在,请不要添加where子句。如果他们在场,请添加地点和适当的条款。
您提到排序但您的查询缺少order by子句。 如果要对数据进行排序,您将要添加一个。
第一次加载,没有where子句或所有过滤器都设置为' ALL'
SELECT * FROM BND_listing left join BND_ListingCategories
on BND_Listing.CatID=BND_ListingCategories.CatID
order by CategoryName, state, city
后续加载,where 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。
我假设通过"听"你的意思是查询字符串:filter-Category将被类别查询字符串中的任何内容替换。由于它已在您的查询中被替换,因此您无法与null进行比较。因为没有过滤器是'所有'你需要考虑到这一点。 试试这个:
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
答案 1 :(得分: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值,这些过滤器填充了我的网格。