高分求教-------太复杂了。都不知掉怎么写这条SQL存储过程

datahandler2 2008-06-09 05:49:22
表有

1.会员角色表userRole----含有会员类型和会员排行字段
2.会员资料表 userTable
3.会员所属企业详细信息表 CompanyTable
4.公司产品表CompanyProd
5.搜索关键字订购表CompanyAdsTable


表逻辑是这样的----:
平常客户搜索 比如搜索某A产品,那么我就要查询生产该A产品的相关详细企业列表信息来供用户查看。这里就涉及到一个比较复杂的排序问题。
问题:
一个企业会员注册了。他发布的产品有好多条。如果说他在注册后,又向我们申请了高级会员,那么在搜索某A产品时,我们仅仅查询出每个企业的一条产品信息,并且我们优先排序那些高级会员。(这个还勉强不会很难)
但如果说这家企业给我们订购了A产品关键字且位置在第X位。那么当其他会员在搜索A产品关键字的时候,我们要求先排该搜索关键字被订购的企业,按照这些企业订购关键字排序的位置进行排序,排完后再排没有订购该关键字的企业,也就是接着按高级会员先排原则





=================
文字表述估计比较难看的明白。
我举个实际例子

1.userRole表
ID 会员类型 会员排序
1 普通会员 0
2. 高级会员 1

2.userTable表

ID 会员帐号 会员角色类型(引用UserRole表主键)
1 user001 1
2 user002 2
3 user005 2
4 user008 1
5 user111 1
6 user114 1


3.companyTable
ID 公司名称 useID(来源于userTable的会员帐号)
1 公司一 user001
2 公司二 user002
3. 公司三 user005
4. 公司四 user111
5. 公司五 user114
6. 公司六 user008
.......................


4.ProdTable产品表
ID 公司ID(来源于CompanyTable主键) 产品名称
1 1 A产品
2 1 B产品
3 1 C产品
4 2 A产品
5 3 C产品
6 3 D产品

5.CompanyAdsTable关键字订购表
ID 关键字名词 公司ID 排序显示位置(第几位)
1 A产品 3 1
2 E产品 3 1
3 B产品 5 1
4. A产品 6 2


此时前台页面搜索A产品的时候,那么应该显示的规则是
优先按照关键字订购表CompanyAdsTable含有A产品的企业的排序显示位置进行排序。然后再排没有被订购此关键字的高级会员。然后才是没有被定够次关键字的普通会员。

=================
注能提供确切的代码样本的,好帖的话。我再追加100分。分值不多。仅表示感谢而已。
重点给分那些好思路好实例的前辈

汗,帖子想弄300分弄不了。看来还要多赚点钱才有这个权限
...全文
884 69 打赏 收藏 转发到动态 举报
写回复
用AI写文章
69 条回复
切换为时间正序
请发表友善的回复…
发表回复
悦竹 2008-06-18
  • 打赏
  • 举报
回复
好文章,不错,顶一下!
datahandler2 2008-06-12
  • 打赏
  • 举报
回复
我的妈啊。我结贴分给错了。原先要给小梁80分的,郁闷。给错人了
小梁真对不住你。虽然分数不是很多。但真对不住您。我另外开帖补你100分。真是郁闷。
changweishao 2008-06-11
  • 打赏
  • 举报
回复
mark,
utpcb 2008-06-11
  • 打赏
  • 举报
回复
mark 很长
xyzqxn 2008-06-11
  • 打赏
  • 举报
回复
学习
datahandler2 2008-06-11
  • 打赏
  • 举报
回复
mark真多。还是大家多贴几个个人想法比较好。呵呵
datahandler2 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 50 楼 qianjin036a 的回复:]
SQL code--> 测试数据: #userRole
if object_id('tempdb.dbo.#userRole') is not null drop table #userRole
create table #userRole (ID int,会员类型 nvarchar(8),会员排序 int)
insert into #userRole
select 1,'普通会员',0 union all
select 2,'高级会员',1
--> 测试数据: #userTable
if object_id('tempdb.dbo.#userTable') is not null drop table #userTable
create table #userTable (ID int,会员帐号 nvarchar…
[/Quote]

=====================
有点明白你的思路了。你是先根据有订购此关键字的排序条件进行排序并把没订购此关键字的公司也就是订购位置为Null 排序到最尾部,然后再排序等同条件的没有订购此关键字的公司和之前已经排序过段含有该关键字的公司,且按照会员级别进行排序。
本来数据会重复的。但因之前的各项都是内链接类型,且过滤条件Where对应的也是内连接表中的过滤条件。所以才不会重复数据出来。可以说这个是个比较巧的情况。
datahandler2 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 45 楼 cacar2008 的回复:]
SELECT ProdTable.产品名称,companyTable.公司名称, userTable.会员帐号,CompanyAdsTable.关键字订购表,userRole.会员排序
FROM ProdTable ,CompanyAdsTable,companyTable ,userTable,userRole
WHERE ProdTable.产品名称*=CompanyAdsTable.关键字名词
AND companyTable.id=ProdTable.公司ID
AND companyTable.useID=userTable.会员帐号
AND userTable.会员角色类型=userRole.ID

ORDER BY CompanyAdsTable.关键字…
[/Quote]
================
是啊。确实是数据库设计上的很大不足
-晴天 2008-06-10
  • 打赏
  • 举报
回复
--> 测试数据: #userRole
if object_id('tempdb.dbo.#userRole') is not null drop table #userRole
create table #userRole (ID int,会员类型 nvarchar(8),会员排序 int)
insert into #userRole
select 1,'普通会员',0 union all
select 2,'高级会员',1
--> 测试数据: #userTable
if object_id('tempdb.dbo.#userTable') is not null drop table #userTable
create table #userTable (ID int,会员帐号 nvarchar(7),会员角色类型 int)
insert into #userTable
select 1,'user001',2 union all
select 2,'user002',2 union all
select 3,'user005',1 union all
select 4,'user008',2 union all
select 5,'user111',1 union all
select 6,'user114',1 union all
select 7,'user07',1 union all
select 8,'user08',1 union all
select 9,'user09',1 union all
select 11,'user101',1 union all
select 16,'user104',1 union all
select 17,'user17',2 union all
select 18,'user18',1 union all
select 19,'user19',2
--> 测试数据: #companyTable
if object_id('tempdb.dbo.#companyTable') is not null drop table #companyTable
create table #companyTable (ID int,公司名称 nvarchar(9),useID varchar(7),地址 varchar(10))
insert into #companyTable
select 1,'公司一','user001',null union all
select 2,'公司二','user002',null union all
select 3,'公司三','user005',null union all
select 4,'公司四','user111',null union all
select 5,'公司五','user114',null union all
select 6,'公司六','user008',null union all
select 7,'公司pp','user07',null union all
select 8,'公司yy','user08',null union all
select 10,'公司cc','user111',null union all
select 11,'公司tt','user114',null union all
select 12,'公司aa','user101',null union all
select 13,'公司er','user09',null union all
select 23,'公司wer','user104',null union all
select 26,'公司we','user17',null union all
select 27,'公司sdfsd','user19',null
--> 测试数据: #ProdTable
if object_id('tempdb.dbo.#ProdTable') is not null drop table #ProdTable
create table #ProdTable (ID int,公司ID int,产品名称 nvarchar(5))
insert into #ProdTable
select 1,1,'A产品' union all
select 2,1,'B产品' union all
select 3,1,'C产品' union all
select 4,2,'A产品' union all
select 5,3,'A产品' union all
select 6,23,'A产品' union all
select 7,6,'A产品' union all
select 8,11,'A产品' union all
select 9.,27,'A产品' union all
select 10,26,'A产品' union all
select 11,10,'A产品'
--> 测试数据: #CompanyAdsTable
if object_id('tempdb.dbo.#CompanyAdsTable') is not null drop table #CompanyAdsTable
create table #CompanyAdsTable (ID int,关键字名词 nvarchar(5),公司ID int,排序显示位置 int)
insert into #CompanyAdsTable
select 1,'A产品',3,1 union all
select 2,'E产品',3,1 union all
select 3,'B产品',5,1 union all
select 4,'A产品',6,2
go

select distinct e.排序显示位置*(-1) as 产品付费数,a.id as 是否会员, d.产品名称,c.公司名称,c.地址 from #userRole a
inner join #userTable b on a.id=b.会员角色类型
inner join #companyTable c on b.会员帐号=c.useid
inner join #prodTable d on c.id=d.公司id
left join #companyAdsTable e on d.公司id=e.公司id
where d.产品名称='A产品'
order by e.排序显示位置*(-1) desc, a.id desc
/*
产品付费数 是否会员 产品名称 公司名称 地址
----------- ----------- ----- --------- ----------
-1 1 A产品 公司三 NULL
-2 2 A产品 公司六 NULL
NULL 2 A产品 公司sdfsd NULL
NULL 2 A产品 公司we NULL
NULL 2 A产品 公司二 NULL
NULL 2 A产品 公司一 NULL
NULL 1 A产品 公司cc NULL
NULL 1 A产品 公司tt NULL
NULL 1 A产品 公司wer NULL

(9 行受影响)

*/
Herb2 2008-06-10
  • 打赏
  • 举报
回复
declare @s varchar(1000)
set @s = 'A产品' --需要查找的产品
select b.*,@s from
(select distinct 公司ID from #ProdTable where 产品名称=@s) a
left join #companyTable b on b.id = a.公司ID
order by
isnull((select rtrim(min(排序显示位置)) from #CompanyAdsTable where 关键字名词 = @s and 公司ID = a.公司ID),'a'),
(select max(会员排序) from #userRole c,#userTable d where c.id=d.会员角色类型 and d.会员帐号 = b.useID) desc
Herb2 2008-06-10
  • 打赏
  • 举报
回复
借用小梁的数据,楼主看看下面的语句是否符合。
set nocount on
--> 测试数据: #userRole
if object_id('tempdb.dbo.#userRole') is not null drop table #userRole
create table #userRole (ID int,会员类型 nvarchar(8),会员排序 int)
insert into #userRole
select 1,'普通会员',0 union all
select 2,'高级会员',1
--> 测试数据: #userTable
if object_id('tempdb.dbo.#userTable') is not null drop table #userTable
create table #userTable (ID int,会员帐号 nvarchar(7),会员角色类型 int)
insert into #userTable
select 1,'user001',1 union all
select 2,'user002',2 union all
select 3,'user005',2 union all
select 4,'user008',1 union all
select 5,'user111',1 union all
select 6,'user114',1
--> 测试数据: #companyTable
if object_id('tempdb.dbo.#companyTable') is not null drop table #companyTable
create table #companyTable (ID int,公司名称 nvarchar(6),useID varchar(7),地址 nvarchar(2))
insert into #companyTable
select 1,'公司一','user001','aa' union all
select 2,'公司二','user002','aa' union all
select 3,'公司三','user005','bb' union all
select 4,'公司四','user111','bb' union all
select 5,'公司五','user114','bb' union all
select 6,'公司六','user008','cc'
--> 测试数据: #ProdTable
if object_id('tempdb.dbo.#ProdTable') is not null drop table #ProdTable
create table #ProdTable (ID int,公司ID int,产品名称 nvarchar(5))
insert into #ProdTable
select 1,1,'A产品' union all
select 2,1,'B产品' union all
select 3,1,'C产品' union all
select 4,2,'A产品' union all
select 5,3,'C产品' union all
select 6,3,'D产品'
--> 测试数据: #CompanyAdsTable
if object_id('tempdb.dbo.#CompanyAdsTable') is not null drop table #CompanyAdsTable
create table #CompanyAdsTable (ID int,关键字名词 varchar(5),公司ID int,排序显示位置 int)
insert into #CompanyAdsTable
select 1,'A产品',3,1 union all
select 2,'E产品',3,1 union all
select 3,'B产品',5,1 union all
select 4,'A产品',6,2

declare @s varchar(1000)
set @s = 'A产品'
select *,@s from
(select distinct 公司ID from #ProdTable where 产品名称=@s) a
left join #companyTable b on b.id = a.公司ID
order by
isnull((select rtrim(min(排序显示位置)) from #CompanyAdsTable where 关键字名词 = @s and 公司ID = a.公司ID),'a'),
(select 会员排序 from #userRole c,#userTable d where c.id=d.会员角色类型 and d.会员帐号 = b.useID) desc


/*
公司ID ID 公司名称 useID 地址
----------- ----------- ------ ------- ---- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
2 2 公司二 user002 aa A产品
1 1 公司一 user001 aa A产品


*/
ouyang156 2008-06-10
  • 打赏
  • 举报
回复
用distinct后的结果能贴出来看看吗?
WindBoy1987 2008-06-10
  • 打赏
  • 举报
回复
顶!
mark
datahandler2 2008-06-10
  • 打赏
  • 举报
回复
[Quote=引用 58 楼 pal_Yao 的回复:]
没有耐心看完整了。大概意思已经了解(不知道是不是误解,呵呵),建议:
建立临时表,把本次查询的结构先一一放进去(包含优先级),如果有多种类型的查询,就多几种临时表,然后再对临时表进行排序显示。查询完毕后删除表。

这样可能需要注意:并发查询的量是不是大?如果大的话,数据库I/O可能上去了,需要注意数据库的效率。
[/Quote]
===========
这也是之前我的一个方案。不过动用临时表跟上面有人提到的消冗法性质是差不多的。在性能上也真的很难把握到底可行还是不可行
fcuandy 2008-06-10
  • 打赏
  • 举报
回复
看看。
ghd2004 2008-06-10
  • 打赏
  • 举报
回复
学习一下
cacar2008 2008-06-10
  • 打赏
  • 举报
回复
SELECT ProdTable.产品名称,companyTable.公司名称, userTable.会员帐号,CompanyAdsTable.关键字订购表,userRole.会员排序
FROM ProdTable ,CompanyAdsTable,companyTable ,userTable,userRole
WHERE ProdTable.产品名称*=CompanyAdsTable.关键字名词
AND companyTable.id=ProdTable.公司ID
AND companyTable.useID=userTable.会员帐号
AND userTable.会员角色类型=userRole.ID

ORDER BY CompanyAdsTable.关键字订购表,userRole.会员排序,ProdTable.产品名称

注关键字不是每家企业会订购所以用"*=",如果其他类似的状况也看情况修改成"*="或'=*'

目前表设计有问题,如:
2.userTable表
ID 会员帐号 会员角色类型(引用UserRole表主键)
1 user001 1
2 user002 2
3 user005 2

建议:会员角色类型(引用UserRole表主键) -->建议:会员角色类型(引用UserRole表主键) -->会员角色类型改为值引用 即取值{0,1}
net205 2008-06-10
  • 打赏
  • 举报
回复
mark学习一下
changjiangzhibin 2008-06-10
  • 打赏
  • 举报
回复
收藏置顶贴
pal_Yao 2008-06-10
  • 打赏
  • 举报
回复
没有耐心看完整了。大概意思已经了解(不知道是不是误解,呵呵),建议:
建立临时表,把本次查询的结构先一一放进去(包含优先级),如果有多种类型的查询,就多几种临时表,然后再对临时表进行排序显示。查询完毕后删除表。

这样可能需要注意:并发查询的量是不是大?如果大的话,数据库I/O可能上去了,需要注意数据库的效率。
加载更多回复(49)

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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