关于SQL排序的问题,相同值太多

灰太狼已不再单身 2012-07-12 05:17:23
遇着个排序 的问题
比如,产品 按照销量排序 ,如果全部的初始值都是相同的,比如 0 ,或者 1 ,这时候,翻页就没用。 第二页没有数据

大家有什么解决方案 。 必须按照这个自动排序,一个字段。

如果实在没法,我就换个字段来排序了。 。哎。。。
...全文
476 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复

USE [HeFan_cs]
GO
/****** Object: StoredProcedure [dbo].[P_GetRecordFromPage] Script Date: 07/18/2012 11:22:41 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO



ALTER PROCEDURE [dbo].[P_GetRecordFromPage]
@tblName nvarchar(1000), -- 表名
@SelectFieldName nvarchar(4000), -- 要显示的字段名(不要加select)
@strWhere nvarchar(4000), -- 查询条件(注意: 不要加 where)
@OrderFieldName nvarchar(255), -- 排序索引字段名
@orderby nvarchar(1000), --排序字段
@PageSize int , -- 页大小
@PageIndex int = 1, -- 页码
@iRowCount int output, -- 返回记录总数
@OrderType int = 0 -- 设置排序类型, 非 0 值则降序

AS

declare @strSQL nvarchar(4000) -- 主语句
declare @strTmp nvarchar(4000) -- 临时变量
declare @strOrder nvarchar(400) -- 排序类型
declare @strRowCount nvarchar(4000) -- 用于查询记录总数的语句
declare @temporderby nvarchar(1000) --最终排序字段

set @OrderFieldName=ltrim(rtrim(@OrderFieldName))

if @OrderType != 0
begin
set @strTmp = '<(select min'
set @strOrder = ' order by ' + @OrderFieldName +' desc'
set @temporderby = ' order by ' + @orderby + ' desc'
end
else
begin
set @strTmp = '>(select max'
set @strOrder = ' order by ' + @OrderFieldName +' asc'
set @temporderby = ' order by ' + @orderby + ' asc'
end

set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + @strOrder + ') as tblTmp)'
+ @strOrder

if @strWhere != ''
begin
set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + ' where ' + @OrderFieldName + @strTmp + '('
+ right(@OrderFieldName,len(@OrderFieldName)-charindex('.',@OrderFieldName)) + ') from (select top ' + str((@PageIndex-1)*@PageSize)
+ @OrderFieldName + ' from ' + @tblName + ' where ' + @strWhere + ' '
+ @strOrder + ') as tblTmp) and ' + @strWhere + ' ' + @strOrder
end
if @PageIndex = 1
begin
set @strTmp = ''
if @strWhere != ''
set @strTmp = ' where ' + @strWhere

set @strSQL = 'select top ' + str(@PageSize) + @SelectFieldName+' from '
+ @tblName + @strTmp + ' ' + @strOrder
end

exec(@strSQL)
print @strSQL
if @strWhere!=''
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName+' where '+@strWhere
end
else
begin
set @strRowCount = 'select @iRowCount=count(*) from ' + @tblName
end

exec sp_executesql @strRowCount,N'@iRowCount int out',@iRowCount out



我觉得这个存储过程,没有问题啊
理想就像内裤 2012-07-18
  • 打赏
  • 举报
回复
网上有很多分页的存储过程。

http://www.cnblogs.com/fishtreeyu/archive/2011/01/01/1923808.html
  • 打赏
  • 举报
回复

select top 15 [Category].title as catetitle,[Product].id,[Product].sold,[Product].userid,[Product].updatetime,
[Product].shopprice,[Product].title as protitle,[Product].imgpath,[Rant].rantname,[Rant].shopendtime
from [Product],[Rant],[Category]
where [Product].sold <
(select min ( sold) from
(select top 15 [Product].sold
from [Product],[Rant],[Category]
where [Product].issale=1 and [Product].state=23 and [Product].userid in (4) and [Product].city=23 and [Product].parentid<>44 and [Rant].id=[Product].userid and [Category].id=[Product].parentid
order by [Product].sold desc ) as tblTmp)
and [Product].issale=1 and [Product].state=23 and [Product].userid in (4) and [Product].city=23 and [Product].parentid<>44 and [Rant].id=[Product].userid and [Category].id=[Product].parentid
order by [Product].sold desc


比如上面的代码,我发现,按照 sold 升序排列分页,如果没有跟 主键ID,就有问题。比如,降序排列,第一页最小数据是1,第二页,其实也有1,那么,这个分页出来的结果,第二页就是小于1,就出了问题。
看来,是要跟着主键ID才可以。
where [Product].sold <
(select min ( sold) from
(select top 15 [Product].sold
from [Product],[Rant],[Category]
where [Product].issale=1 and
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 的回复:]

分页算法出错了。

网上很多分页算法都当排序字段几乎不重复。

这是常见的错误,用于排序的字段大量重复会导致分页出来的数据不是设计需要的。
[/Quote]

请问你有分页存储过程的程序吗?方便发一下。
zj25810 2012-07-16
  • 打赏
  • 举报
回复
排序字段的不同,不可能影响数据量的变化。肯定就是LZ分页的方法有问题。
winner2050 2012-07-16
  • 打赏
  • 举报
回复
分页算法出错了。

网上很多分页算法都当排序字段几乎不重复。

这是常见的错误,用于排序的字段大量重复会导致分页出来的数据不是设计需要的。
H_Gragon 2012-07-16
  • 打赏
  • 举报
回复
翻页没用,是不是翻页重新绑定数据的时候,如果查询条件如果是你自己输入的,你设置的查询条件应该都又

清空了吧!所以绑定出来的结果不是你想要的!
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

我也有遇到这样的问题,我是按添加时间排序的,可数据是一次性导入到表中的,时间都是一样的,结果分页的时候都只是显示第一页的内容,后来就加了两个字段排序。
分页的存储过程是从网上找的,都大同小意,试了几个都是一样的。没细看里面的写法。
[/Quote]
分页程序本来是网上找的。而且,和群里其他人用的分页存储过程也是一样的 。没区别。涉及到分页查询,感觉加多字段,不是那么好。
  • 打赏
  • 举报
回复
那是你分页程序或者分页存储过程有问题,
  • 打赏
  • 举报
回复
这个问题我遇到过 你先用销量排序 然后添加
,id desc
woainilei 2012-07-13
  • 打赏
  • 举报
回复
我也有遇到这样的问题,我是按添加时间排序的,可数据是一次性导入到表中的,时间都是一样的,结果分页的时候都只是显示第一页的内容,后来就加了两个字段排序。
分页的存储过程是从网上找的,都大同小意,试了几个都是一样的。没细看里面的写法。
  • 打赏
  • 举报
回复
多字段排序了
李班头 2012-07-13
  • 打赏
  • 举报
回复
楼主的分页程序可能有问题了,排序也不回少了数量的啊,只是排序的前后次序不一样而已
qxyywy 2012-07-13
  • 打赏
  • 举报
回复
[Quote=引用楼主 的回复:]
遇着个排序 的问题
比如,产品 按照销量排序 ,如果全部的初始值都是相同的,比如 0 ,或者 1 ,这时候,翻页就没用。 第二页没有数据

大家有什么解决方案 。 必须按照这个自动排序,一个字段。

如果实在没法,我就换个字段来排序了。 。哎。。。
[/Quote]

如1楼所说 多字段排序就行了
另外 排序如何能影响查询数据的多少???
槑党--一缕风 2012-07-13
  • 打赏
  • 举报
回复
order by 后面多更几个条件就行了
H_Gragon 2012-07-13
  • 打赏
  • 举报
回复
用oder by!
色拉油 2012-07-12
  • 打赏
  • 举报
回复
排序会改变数据量???
这一站_IT 2012-07-12
  • 打赏
  • 举报
回复
考虑优先级顺序进行多字段排序吧, 在order by 后多加一些字段进行排序
order by 字段1,字段2,字段3 desc
tan598121925 2012-07-12
  • 打赏
  • 举报
回复
++ 多条件的排序[Quote=引用 3 楼 的回复:]

你可以多个字段排序,比如优先销量排序,如果相同,在按照时间排序

Order by 字段1,字段2,字段3
[/Quote]
  • 打赏
  • 举报
回复
你可以多个字段排序,比如优先销量排序,如果相同,在按照时间排序

Order by 字段1,字段2,字段3
加载更多回复(2)

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧