一个关于SQL语句问题

时间:2021-07-11 17:36:25
有一个企业表和一个样品
根据企业的ID可以发布多个样品,这些样品有可能是连续发的
在列表上显示出来的话,很有可能都是显示一个企业发布的样品,这样不行,你看可不可以,每个企业只显示一个样品
比如说一页显示33个样品,也是就是33个企业的样品(都显示一个),如果还有余下的企业以此例推,到下一页,如果根据企业ID发布的样品都显示一个完之后,接着显示样品的第二个,按照上面的显示方法以此例推
企业表Corpoation_cn  字段 cid
样品表Product_cn     字段 id,cid,pname,pic 
拜求,本人在线等

30 个解决方案

#1


看不懂

#2


select distinct(cid),id,pname,pic from Product_cn 

#3



select distinct(cid),id,pname,pic from Product_cn order by id 

#4


楼上的语句不能完全满足要求。

#5


不知道你最终的需求

#6


楼上都不能满足要求,好像要创建索引

#7


deknight
 
(追逐梦想) 
比如说有说个企业,10个企业中发布样品的数量不同.
最终的想法是在列表页,把每个企业发布的样品都取一个出来,当取到最后个的企业取一个样品之后,接着取第二个样品,以后以此例推.根据样品的ID倒序
如果按照常规的方法,都只能一个企业样品显示完,这样不合要求

#8


  你还要排序?

#9


加分页???

#10


需要最新发布的样品放在前面

#11


比如企业A B各发布5个产品,你的意思是
先取出
A 1 B 1 然后
A 2 B 2
A 3 B 3
一直到最后?
我还是没明白你上面的描述

#12


要分页的,假如发布了N个企业发布1万个,甚至更多样品,那肯定要分页的呀

#13


"假如发布了N个企业"写错了"假如有N个企业"

#14


   那我问你  `假设有一万个企业 每页显示20条` 那么企业那不要先排完一万个啊``才可以看到 企业的第二条信息?

#15


deknight
 
(追逐梦想) 
楼上,我就是这个意思,并且根据样品的先后顺序排序,最先发布要排在前观

#16


是的,这是项目需求,没办法

#17


你的需求是:先显示每个企业发布的最新的一个产品,直到显示完所有企业之后再显示每个企业的第二个产品??

#18


你可以这样,根据企业分组,把Id排序,取第一个产品 

#19


zyl_leilei
 
(小蕾) 
是这样的

#20


select distinct(cid),id,pname,pic from Product_cn order by datetime

#21


zyl_leilei
 
(小蕾)  
楼上的,可不可写出来,让我参考下

#22


看不懂

#23


哎,怎么没有人帮我解答呀

#24


一个关于SQL语句问题
 挺难的` group by 和 distanct 都不好用``

#25


你要的这个,不是1个SQL能出来的

#26


deknight
 
(追逐梦想) 
我也觉得在语句里实现这样的很难的,不过可以用另外的方法实现
这是我的思路
每个企业的样品都要自己的独立有索引,1、2、3、4、5这样的,也就是说每个企业都有这样的样品索引。然后查的时候就order by 这个索引,倒序,
可不可以

#27


晕死,看了半天,是看下面的回复和你的回复才看懂意思了,
用存储过程分页查询吧:
没时间整理,自己整理吧

CREATE PROCEDURE GetRecordFromPage 
    @tblName      varchar(255),       -- 表名 
    @fldName      varchar(255),       -- 字段名 
    @PageSize     int = 10,           -- 页尺寸 
    @PageIndex    int = 1,            -- 页码 
    @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回 
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序 
    @strWhere     varchar(4000) = ''  -- 查询条件 (注意: 不要加 where) 
AS 
 
declare  @strSQL   varchar(6000)     -- 主语句 
declare @strTmp   varchar(6000)     -- 临时变量 
declare @strOrder varchar(6000)       -- 排序类型 
 
if @OrderType != 0 
begin 
    set @strTmp = '<(select min' 
    set @strOrder = ' order by [' + @fldName +'] desc' 
end 
else 
begin 
    set @strTmp = '>(select max' 
    set @strOrder = ' order by [' + @fldName +'] asc' 
end 
 
set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
    + @strOrder 
 
if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
        + @fldName + '] from [' + @tblName + '] where (' + @strWhere + ') ' 
        + @strOrder + ') as tblTmp) and (' + @strWhere + ') ' + @strOrder 
 
if @PageIndex = 1 
begin 
    set @strTmp = '' 
    if @strWhere != '' 
        set @strTmp = ' where (' + @strWhere + ')' 
 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + ']' + @strTmp + ' ' + @strOrder 
end 
 
if @IsCount != 0 
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 
 
exec (@strSQL) 
GO 

go
if exists (select * from sysobjects where xtype='p' and name='UP_Test_Page')
drop proc UP_Test_Page
go

create proc UP_Test_Page
  @pageSize int,
  @pageIndex int
as 
declare @n int
begin

select * into ##temp from ( select * from test) a

set @n = (select count(*) from ##temp)
if(@pageIndex <1)
set @pageIndex=1
exec GetRecordFromPage '##temp','tid',@pageSize,@pageIndex,'0','0',''
drop table ##temp
return @n

end 

go

#28


s8975565
 
("漠"︶路人) 
楼上的,分页肯定是用储存过程的,关键要想显示想得显示的数据,这个才是难点呀

#29


引用 26 楼 huyu0123 的回复:
deknight
 
(追逐梦想) 
我也觉得在语句里实现这样的很难的,不过可以用另外的方法实现
这是我的思路
每个企业的样品都要自己的独立有索引,1、2、3、4、5这样的,也就是说每个企业都有这样的样品索引。然后查的时候就order by 这个索引,倒序,
可不可以



赞成

#30


对于db2 V9及以上的,应该可以用如下sql:
select pname, cid 
from
(select pname, cid, row_number() over (partition by cid order by id) as order_no
from   Product_cn ) as tmp
order by order_no

#1


看不懂

#2


select distinct(cid),id,pname,pic from Product_cn 

#3



select distinct(cid),id,pname,pic from Product_cn order by id 

#4


楼上的语句不能完全满足要求。

#5


不知道你最终的需求

#6


楼上都不能满足要求,好像要创建索引

#7


deknight
 
(追逐梦想) 
比如说有说个企业,10个企业中发布样品的数量不同.
最终的想法是在列表页,把每个企业发布的样品都取一个出来,当取到最后个的企业取一个样品之后,接着取第二个样品,以后以此例推.根据样品的ID倒序
如果按照常规的方法,都只能一个企业样品显示完,这样不合要求

#8


  你还要排序?

#9


加分页???

#10


需要最新发布的样品放在前面

#11


比如企业A B各发布5个产品,你的意思是
先取出
A 1 B 1 然后
A 2 B 2
A 3 B 3
一直到最后?
我还是没明白你上面的描述

#12


要分页的,假如发布了N个企业发布1万个,甚至更多样品,那肯定要分页的呀

#13


"假如发布了N个企业"写错了"假如有N个企业"

#14


   那我问你  `假设有一万个企业 每页显示20条` 那么企业那不要先排完一万个啊``才可以看到 企业的第二条信息?

#15


deknight
 
(追逐梦想) 
楼上,我就是这个意思,并且根据样品的先后顺序排序,最先发布要排在前观

#16


是的,这是项目需求,没办法

#17


你的需求是:先显示每个企业发布的最新的一个产品,直到显示完所有企业之后再显示每个企业的第二个产品??

#18


你可以这样,根据企业分组,把Id排序,取第一个产品 

#19


zyl_leilei
 
(小蕾) 
是这样的

#20


select distinct(cid),id,pname,pic from Product_cn order by datetime

#21


zyl_leilei
 
(小蕾)  
楼上的,可不可写出来,让我参考下

#22


看不懂

#23


哎,怎么没有人帮我解答呀

#24


一个关于SQL语句问题
 挺难的` group by 和 distanct 都不好用``

#25


你要的这个,不是1个SQL能出来的

#26


deknight
 
(追逐梦想) 
我也觉得在语句里实现这样的很难的,不过可以用另外的方法实现
这是我的思路
每个企业的样品都要自己的独立有索引,1、2、3、4、5这样的,也就是说每个企业都有这样的样品索引。然后查的时候就order by 这个索引,倒序,
可不可以

#27


晕死,看了半天,是看下面的回复和你的回复才看懂意思了,
用存储过程分页查询吧:
没时间整理,自己整理吧

CREATE PROCEDURE GetRecordFromPage 
    @tblName      varchar(255),       -- 表名 
    @fldName      varchar(255),       -- 字段名 
    @PageSize     int = 10,           -- 页尺寸 
    @PageIndex    int = 1,            -- 页码 
    @IsCount      bit = 0,            -- 返回记录总数, 非 0 值则返回 
    @OrderType    bit = 0,            -- 设置排序类型, 非 0 值则降序 
    @strWhere     varchar(4000) = ''  -- 查询条件 (注意: 不要加 where) 
AS 
 
declare  @strSQL   varchar(6000)     -- 主语句 
declare @strTmp   varchar(6000)     -- 临时变量 
declare @strOrder varchar(6000)       -- 排序类型 
 
if @OrderType != 0 
begin 
    set @strTmp = '<(select min' 
    set @strOrder = ' order by [' + @fldName +'] desc' 
end 
else 
begin 
    set @strTmp = '>(select max' 
    set @strOrder = ' order by [' + @fldName +'] asc' 
end 
 
set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
    + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
    + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
    + @fldName + '] from [' + @tblName + ']' + @strOrder + ') as tblTmp)' 
    + @strOrder 
 
if @strWhere != '' 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + '] where [' + @fldName + ']' + @strTmp + '([' 
        + @fldName + ']) from (select top ' + str((@PageIndex-1)*@PageSize) + ' [' 
        + @fldName + '] from [' + @tblName + '] where (' + @strWhere + ') ' 
        + @strOrder + ') as tblTmp) and (' + @strWhere + ') ' + @strOrder 
 
if @PageIndex = 1 
begin 
    set @strTmp = '' 
    if @strWhere != '' 
        set @strTmp = ' where (' + @strWhere + ')' 
 
    set @strSQL = 'select top ' + str(@PageSize) + ' * from [' 
        + @tblName + ']' + @strTmp + ' ' + @strOrder 
end 
 
if @IsCount != 0 
    set @strSQL = 'select count(*) as Total from [' + @tblName + ']' 
 
exec (@strSQL) 
GO 

go
if exists (select * from sysobjects where xtype='p' and name='UP_Test_Page')
drop proc UP_Test_Page
go

create proc UP_Test_Page
  @pageSize int,
  @pageIndex int
as 
declare @n int
begin

select * into ##temp from ( select * from test) a

set @n = (select count(*) from ##temp)
if(@pageIndex <1)
set @pageIndex=1
exec GetRecordFromPage '##temp','tid',@pageSize,@pageIndex,'0','0',''
drop table ##temp
return @n

end 

go

#28


s8975565
 
("漠"︶路人) 
楼上的,分页肯定是用储存过程的,关键要想显示想得显示的数据,这个才是难点呀

#29


引用 26 楼 huyu0123 的回复:
deknight
 
(追逐梦想) 
我也觉得在语句里实现这样的很难的,不过可以用另外的方法实现
这是我的思路
每个企业的样品都要自己的独立有索引,1、2、3、4、5这样的,也就是说每个企业都有这样的样品索引。然后查的时候就order by 这个索引,倒序,
可不可以



赞成

#30


对于db2 V9及以上的,应该可以用如下sql:
select pname, cid 
from
(select pname, cid, row_number() over (partition by cid order by id) as order_no
from   Product_cn ) as tmp
order by order_no