联盟不会给你你想要的。其目的是将两个或多个查询的结果连接在一起并保持不同的值。在您的情况下,联合的前半部分捕获所有数据,后半部分捕获过滤后的数据。由于前半部分捕获了所有内容,因此所有内容都会被返回。
您似乎这样做是因为您没有用于第一次运行的过滤器,但您希望在第二次运行时使用过滤器。
如果查询字符串不存在,请勿添加 where 子句。如果存在,请添加 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 子句。
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 个。
我假设“监听”是指 querystring: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