使用 UNION 将数据拉入网格
Using UNION to pull data into grid
我的网站上有一个数据网格,我从 2 tables 中提取公司信息。
我正在创建一个表格来根据 3 个过滤器(类别、州、城市)对这些结果进行排序
这是我最初将数据加载到网格中的查询。我希望它填充我的所有 table 数据,直到用户决定过滤它,这就是为什么我使用 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',并将城市和州下拉菜单保留为默认选择。
我的 "listening" 查询字符串参数查询在我的应用程序上无法正常工作。但是,当在 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 Studio
Union 无法满足您的需求。它的目的是将 2 个或多个查询的结果连接在一起以保持不同的值。在您的情况下,联合的前半部分捕获所有数据,后半部分捕获过滤后的数据。由于前半部分捕获了所有内容,因此全部返回。
您这样做似乎是因为第一个 运行 没有过滤器,但第二个 运行 需要过滤器。
如果查询字符串不存在,请不要添加 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 个。
我假设 "listening" 你的意思是 querystring:filter-Category 将被替换为类别查询字符串中的任何内容。由于它已在您的查询中被替换,因此您无法与 null 进行比较。由于没有 'ALL' 过滤器,因此您需要考虑到这一点。
试试这个:
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
感谢您提供的所有帮助和示例。我能够对我的查询进行排序,事实上我遇到了需要首先解决的网格问题。
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 值。
我的网站上有一个数据网格,我从 2 tables 中提取公司信息。
我正在创建一个表格来根据 3 个过滤器(类别、州、城市)对这些结果进行排序
这是我最初将数据加载到网格中的查询。我希望它填充我的所有 table 数据,直到用户决定过滤它,这就是为什么我使用 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',并将城市和州下拉菜单保留为默认选择。
我的 "listening" 查询字符串参数查询在我的应用程序上无法正常工作。但是,当在 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 Studio
Union 无法满足您的需求。它的目的是将 2 个或多个查询的结果连接在一起以保持不同的值。在您的情况下,联合的前半部分捕获所有数据,后半部分捕获过滤后的数据。由于前半部分捕获了所有内容,因此全部返回。
您这样做似乎是因为第一个 运行 没有过滤器,但第二个 运行 需要过滤器。
如果查询字符串不存在,请不要添加 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 个。
我假设 "listening" 你的意思是 querystring:filter-Category 将被替换为类别查询字符串中的任何内容。由于它已在您的查询中被替换,因此您无法与 null 进行比较。由于没有 'ALL' 过滤器,因此您需要考虑到这一点。 试试这个:
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
感谢您提供的所有帮助和示例。我能够对我的查询进行排序,事实上我遇到了需要首先解决的网格问题。
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 值。