一个高深的SQL查询语句,冰天雪地跪求解答

零起飞 2009-11-19 04:27:36
现在我有张企业用户表

company -企业用户表
userID (用户ID字段)
companyName (企业名称)

review 评论表
userID (用户ID字段)
reTitle (评论标题)
reContent (评论内容)
reIntegral (评论分数)

我现在要要对企业用户表进行查询排序,条件是,跟据评论表中的,评论分数的平均值,来排序。

如:现在有userID=1 这个用户 有两条评论,分数分别是 10 ,8 ,那他的平均值应是,(10+8)/2=9 ,然后得用9这个数来排序
...全文
186 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
evenfun 2009-11-20
  • 打赏
  • 举报
回复
用 CASE WHEN n.avg_fs is not null THEN n.avg_fs ELSE 0 END
代替 isnull(n.avg_fs,0)
evenfun 2009-11-20
  • 打赏
  • 举报
回复
isnull不是mysql的函数
零起飞 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 dawugui 的回复:]
引用 18 楼 lx_mai 的回复:
是对了,在MSSQL可以的,我就不知道为什么在mysqk就不行了

那就不知道了,友情帮顶.
[/Quote]

总是这里有错
isnull(n.avg_fs,0) avg_fs 提示
“the right syntax to usr near '0) as avg_fs from "
dawugui 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 lx_mai 的回复:]
是对了,在MSSQL可以的,我就不知道为什么在mysqk就不行了
[/Quote]
那就不知道了,友情帮顶.
零起飞 2009-11-19
  • 打赏
  • 举报
回复
是对了,在MSSQL可以的,我就不知道为什么在mysqk就不行了
dawugui 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 lx_mai 的回复:]
这个查询还是不行,avg_fsd 这列出来全是变成1了
[/Quote]
不可能不行,如果不行,就是你的问题了.
以下为测试结果.

create table company(userID int,companyName varchar(10))
insert into company values(1 , '一')
insert into company values(2 , '二')
insert into company values(3 , '三')
create table review(userID int, reIntegral int)
insert into review values(1 , 1)
insert into review values(1 , 2)
insert into review values(1 , 3)
insert into review values(1 , 4)
insert into review values(1 , 5)
insert into review values(2 , 2)
insert into review values(2 , 3)
go

select m.* , isnull(avg(n.reIntegral*1.0),0) avg_fs
from company m left join review n
on m.userID = n.userID group by
m.userID , m.companyName
order by avg_fs desc

select m.* , isnull(n.avg_fs,0) avg_fs from company m left join
(select userID , avg(reIntegral*1.0) avg_fs from review group by userID) n
on m.userID = n.userID
order by avg_fs desc

drop table company , review

/*
userID companyName avg_fs
----------- ----------- ----------------------------------------
1 一 3.000000
2 二 2.500000
3 三 .000000

(所影响的行数为 3 行)

警告: 聚合或其它 SET 操作消除了空值。
userID companyName avg_fs
----------- ----------- ----------------------------------------
1 一 3.000000
2 二 2.500000
3 三 .000000

(所影响的行数为 3 行)

*/
零起飞 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 dawugui 的回复:]
引用 3 楼 lx_mai 的回复:
补充下,前面两位那样是可以,但是还有一点是,如果没有评论的用户也要显示出来才行,你那样只能查询出有评论的用户


SQL codeselect m.* ,isnull(avg(n.reIntegral*1.0),0) avg_fsfrom company mleftjoin review non m.userID= n.userIDgroupby
m.userID , m.companyNameorderby avg_fsdesc

SQL codeselect m.* ,isnull(n.avg_fs,0) avg_fsfrom company mleftjoin
(select userID ,avg(reIntegral*1.0) avg_fsfrom reviewgroupby userID) non m.userID= n.userIDorderby avg_fsdesc
[/Quote]

这个查询还是不行,avg_fsd 这列出来全是变成1了
Aslangg 2009-11-19
  • 打赏
  • 举报
回复
这个标题很符合现在的天气~
soft_wsx 2009-11-19
  • 打赏
  • 举报
回复
冰天雪地跪求解答 这是标题真好!
dawugui 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lx_mai 的回复:]
补充下,前面两位那样是可以,但是还有一点是,如果没有评论的用户也要显示出来才行,你那样只能查询出有评论的用户
[/Quote]

select m.* , isnull(avg(n.reIntegral*1.0),0) avg_fs 
from company m left join review n
on m.userID = n.userID group by
m.userID , m.companyName
order by avg_fs desc


select m.* , isnull(n.avg_fs,0) avg_fs from company m left join
(select userID , avg(reIntegral*1.0) avg_fs from review group by userID) n
on m.userID = n.userID
order by avg_fs desc
dawugui 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lx_mai 的回复:]
补充下,前面两位那样是可以,但是还有一点是,如果没有评论的用户也要显示出来才行,你那样只能查询出有评论的用户
[/Quote]

select m.* , isnull(avg(n.reIntegral*1.0),0) avg_fs 
from company m left join review n
on m.userID = n.userID group by
m.userID , m.companyName
order by avg_fs desc
netcup 2009-11-19
  • 打赏
  • 举报
回复
晕,看了半天,是MYSQL的!楼主也不在第一楼说清楚。。。。。
好汉坡 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lx_mai 的回复:]
引用 5 楼 hero__stone 的回复:
SQL codeselect m.* ,avg(n.reIntegral*1.0) avg_fsfrom company mleftjoin review nwhere m.userID= n.userIDgroupby m.userID , m.companyNameorderby avg_fs
这个不行呀,我那是mysql的
[/Quote]
零起飞 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 icelovey 的回复:]
SQL codeselect m.* ,avg(n.reIntegral*1.0) 平均值from company minnerjoin review non m.userID= n.userIDgroupby m.userID , m.companyNameorderby 平均值desc
[/Quote]这也也只能查出有评论的用户,没有评论的还是查不来
零起飞 2009-11-19
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 hero__stone 的回复:]
SQL codeselect m.* ,avg(n.reIntegral*1.0) avg_fsfrom company mleftjoin review nwhere m.userID= n.userIDgroupby m.userID , m.companyNameorderby avg_fs
[/Quote]这个不行呀,我那是mysql的
icelovey 2009-11-19
  • 打赏
  • 举报
回复

select m.* , avg(n.reIntegral*1.0) 平均值
from company m left join review n on m.userID = n.userID
group by m.userID , m.companyName
order by 平均值 desc
icelovey 2009-11-19
  • 打赏
  • 举报
回复

select m.* , avg(n.reIntegral*1.0) 平均值
from company m inner join review n on m.userID = n.userID
group by m.userID , m.companyName
order by 平均值 desc
好汉坡 2009-11-19
  • 打赏
  • 举报
回复
select m.* , avg(n.reIntegral*1.0) avg_fs 
from company m
left join review n
where m.userID = n.userID
group by m.userID , m.companyName
order by avg_fs
dawugui 2009-11-19
  • 打赏
  • 举报
回复
select m.* , avg(n.reIntegral*1.0) avg_fs 
from company m , review n
where m.userID = n.userID group by m.userID , m.companyName
order by avg_fs


select m.* , avg(n.reIntegral*1.0) avg_fs 
from company m , review n
where m.userID = n.userID group by m.userID , m.companyName
order by avg_fs desc
零起飞 2009-11-19
  • 打赏
  • 举报
回复
补充下,前面两位那样是可以,但是还有一点是,如果没有评论的用户也要显示出来才行,你那样只能查询出有评论的用户
加载更多回复(2)

22,206

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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