• «
  • 1
  • 2
  • »
  • Pages: 1/2     Go

none.gif

泰禾

很难得一个SQL,Java大佬进来看看能写不

有个新闻表:新闻id,新闻标题,图片地址,缩略图地址,新闻内容,访问量,发布者,创建时间;
  要求
    a.搜索条件:6个月(包括当前月)历史发布的新闻,每个月最新发布并且有访问量的3条数据;
    b.搜索展示:月份,号数,缩略图地址,新闻id,新闻标题,创建时间;
有解吗

5f68f8be928fce6e.png

刀俎怯娼

B1F  2021-06-20 20:13
(知难,行亦难)
很难得一个SQL

1181380.png

萌豚海市

B2F  2021-06-20 20:15
(重口恶堕只为刺激,萌豚纯爱才是本质。)
的地得小警察不请自来

a93a159ff2dbedef.jpg

Devil

这不是最简单的单表查询吗
把你的条件在where里写好不就行了

370369.jpg

多哆洛

B4F  2021-06-20 20:20
(何来英雄,何必英雄)
这都不会,别学SQL了,来工地和我搬砖吧,工头和我很熟的

442557.jpg

Duke

select **** where *****  join  *****  union *****
完毕

121996.jpg

無名小卒α

B6F  2021-06-20 20:22
(你看不见我,你看不见我,你看不见我……)
这是基本就是课堂习题级别的了吧,这都不会还是好好看课本复习一下吧

none.gif

sion4698

看你用什么数据库如果是oracle,使用分析函数就行,参考:https://blog.csdn.net/wangchsh2008/article/details/53419991/,同理很多数据库有类似的分析函数。
如果是mysql就只能用group by,也能实现,不过效率和复杂度会高很多,建议数据不大java编程处理

none.gif

泰禾

回 3楼(Devil) 的帖子

有仔细看题吗   

none.gif

泰禾

回 5楼(Duke) 的帖子

现在是6个月,可以无脑写,把月数参数化,怎么写

none.gif

泰禾

回 6楼(無名小卒α) 的帖子

你根本没仔细看题   

none.gif

sion4698

这种分组求极值的sql写的好不容易,我就见过做了5-6年开发的人都写不出的,或者要使用多次查询,或者group by后利用多次的left join效率极差。

none.gif

泰禾

重点是:--每个月最新发布并且有访问量的3条数据--

泰禾

回 11楼(70def61b) 的帖子


1370956.jpg

丶千夜寻

B14F  2021-06-20 20:36
(月亮出来我晒月亮)
众所周知 C++才是最好用的编程语言

A3EZatGHlB4J5ro.png

Neko

B15F  2021-06-20 20:39
(自购贴均为原档)
月份不确定就动态sql吧

none.gif

demo9527

所以为啥一定要一条sql写啊,每个月搜的时候单独搜出来再塞到redis里,需要再组装不方便吗 ,反正数据量又不大
当然用帆软的那种当我没说,除了优化表结构外,用sql怎么拼都感觉挺慢的

none.gif

sion4698

select * from (
SELECT ?,?,?,row_number() OVER(PARTITION BY 月份 ORDER BY 访问量 desc) e FROM test_abc) t where e <= 3

oracle参考,mysql8.0也有这个函数,如果低版本mysql,建议多次查询union,或参考https://blog.csdn.net/qq_35825178/article/details/105764718,非常不利于阅读

none.gif

howhaw

B18F  2021-06-20 20:48
(howhaw)
数据库支持row_number函数就用这个函数,像mysql这类不支持的,用session变量或者写存储过程,google一下top n in group by就很多答案了  

none.gif

泰禾

回 17楼(70def61b) 的帖子

看上去不错

121996.jpg

無名小卒α

B20F  2021-06-20 21:22
(你看不见我,你看不见我,你看不见我……)
先把没有访问量的筛掉,
再用date_format(create_time,'%y%m')函数按月份分组(不要用month,不然应付不了跨年),
再用count或者row_number筛出来前三,

select * from news t1
where pv > 0 and date_format(now(),'%y%m') < date_format(DATE_ADD(create_time, interval 6 MONTH),'%y%m')  and (
select count(*) from news  t2 where pv > 0 and date_format(t1.create_time,'%y%m') = date_format(t2.create_time,'%y%m') and create_time < t1.create_time
) < 3

row_number的更简洁,思路上也都差不多,楼上已经写了
然而这么写效率非常低,工程上基本没有这么用的,与其这么写还不如每个月单独查

none.gif

813d86e0

1.查询6个月并且且有访问量的数据
SELECT
     *
FROM
     demo
WHERE
createTime BETWEEN date_sub(now(), INTERVAL 6 MONTH)
AND now()
AND count > 0

2.进行按月分组
SELECT
    MONTH (createTime),
    DAYOFMONTH(createTime),
    imgUrl2,
    id,
    content,
    title,
    createTime
FROM
    (
        SELECT
            *
        FROM
            demo
        WHERE
            createTime BETWEEN date_sub(now(), INTERVAL 6 MONTH)
        AND now()
        AND count > 0
    ) AS A
GROUP BY
    DATE_FORMAT(createTime, '%Y%u')
HAVING
    COUNT(1) < 3



基本都是百度的函数,缝合怪组合一起的,没有效率可言,不建议sql写过于复杂的逻辑   

none.gif

2c427677

知道大佬都在这里出没啊

none.gif

2c427677

知道大佬都在这里出没啊

none.gif

Angelina Jolie

B24F  2021-06-20 21:51
(珍妮--[sell=0][/sell])
...

none.gif

91919

B25F  2021-06-20 22:54
(麻了 麻了 麻麻了)
只会用

a1.gif

kuci

B26F  2021-06-20 23:28
(djng1147)
还以为是是java连接数据库读取数据之类的,这不最基础的吗?书上的例题水平

none.gif

筑梦的幽灵

进来还以为多大点事,六个月能有多少数据,直接查出来放内存处理都行
甚至拼六个union都行

none.gif

不知道叫什么聊

B28F  2021-06-20 23:42
(啊,好奇妙!)
你这直接查出来然后用程序处理,比你写复杂sql方便多了吧。

none.gif

筑梦的幽灵

引用
引用第27楼eb065437于2021-06-20 23:38发表的  :
进来还以为多大点事,六个月能有多少数据,直接查出来放内存处理都行
甚至拼六个union都行


顺便搜索了一下,一堆结果
http://www.silota.com/docs/recipes/sql-top-n-group.html
https://blogs.oracle.com/sql/how-to-select-the-top-n-rows-per-group-with-sql-in-oracle-database
https://stackoverflow.com/questions/15969614/in-sql-how-to-select-the-top-2-rows-for-each-group

none.gif

泰禾

回 29楼(筑梦的幽灵) 的帖子

学习了
  • «
  • 1
  • 2
  • »
  • Pages: 1/2     Go