sql查询获得一个tweet列表,每个tweet的最新10条评论都是由一个作家写的,比如“barack obama”

eaf3rand  于 2021-08-01  发布在  Java
关注(0)|答案(1)|浏览(215)

以下是表格结构,

  1. create table WRITER (
  2. id int primary key,
  3. name varchar2(100)
  4. )
  5. create table TWEET(
  6. id int primary key,
  7. tweet varchar2(100),
  8. createdDate TIMESTAMP,
  9. writerid int foreign key references id of table WRITER
  10. )
  11. create table COMMENT (
  12. id int primary key,
  13. comment varchar2(1000),
  14. createdDate TIMESTAMP,
  15. tweetid int foreign key references id of table TWEET,
  16. userid int foreign key references id of table USER
  17. )
  18. create table USER (
  19. id int primary key,
  20. name varchar2(100)
  21. )

我尝试使用下面的查询,但它没有给出所需的输出。

  1. SELECT id, tweetid, comment, createdDate
  2. FROM COMMENT
  3. WHERE tweetid in (SELECT id from TWEET WHERE writerid IN
  4. (select id from WRITER WHERE name = 'Barack Obama'))
  5. AND ROWNUM<11
  6. GROUP BY id, tweetid, comment, createdDate
  7. ORDER BY tweetid;

如何获得正确的输出?我需要最新的10条评论,每推特的'巴拉克奥巴马'

kkbh8khc

kkbh8khc1#

你可以使用分析函数 ROW_NUMBER 具体如下:

  1. SELECT *
  2. FROM (
  3. SELECT C.ID,
  4. C.TWEETID,
  5. C.COMMENT,
  6. C.CREATEDDATE,
  7. ROW_NUMBER() OVER(
  8. PARTITION BY C.TWEETID
  9. ORDER BY C.CREATEDDATE DESC
  10. ) AS RN
  11. FROM COMMENT C
  12. JOIN TWEET T
  13. ON C.TWEETID = T.ID
  14. JOIN WRITER W
  15. ON T.WRITEID = W.ID
  16. WHERE W.NAME = 'Barack Obama'
  17. )
  18. WHERE RN <= 10;

样本数据:

  1. SQL> SELECT * FROM WRITER;
  2. ID NAME
  3. ------ ----------------------------------------------------------------------------------------------------
  4. 1 Barack Obama
  5. SQL> SELECT * FROM TWEET;
  6. ID TWEET CREATEDDATE WRITER_ID
  7. ------ ----- --------------------------------------------------------------------------- ----------
  8. 100 T1 30-JUN-20 02.17.32.000000 PM 1
  9. 101 T2 16-JUN-20 02.21.51.000000 PM 1
  10. SQL> SELECT * FROM COMMENTS;
  11. ID COMMENTS CREATEDDATE TWEET_ID
  12. ------ ---------- --------------------------------------------------------------------------- --------
  13. 1000 T1C1 30-JUN-20 02.17.58.000000 PM 100
  14. 1001 T1C2 30-JUN-20 03.17.58.000000 PM 100
  15. 2000 T2C1 30-JUN-20 02.21.51.000000 PM 101
  16. 2001 T2C2 29-JUN-20 02.21.51.000000 PM 101
  17. 2002 T2C2 28-JUN-20 02.21.51.000000 PM 101
  18. 2003 T2C2 27-JUN-20 02.21.51.000000 PM 101
  19. 2004 T2C2 26-JUN-20 02.21.51.000000 PM 101
  20. 2005 T2C2 25-JUN-20 02.21.51.000000 PM 101
  21. 2006 T2C2 24-JUN-20 02.21.51.000000 PM 101
  22. 2007 T2C2 23-JUN-20 02.21.51.000000 PM 101
  23. 2008 T2C2 22-JUN-20 02.21.51.000000 PM 101
  24. 2009 T2C2 21-JUN-20 02.21.51.000000 PM 101
  25. 2010 T2C2 20-JUN-20 02.21.51.000000 PM 101
  26. 2011 T2C2 19-JUN-20 02.21.51.000000 PM 101
  27. 2012 T2C2 18-JUN-20 02.21.51.000000 PM 101
  28. 15 rows selected.
  29. SQL>

查询输出:

  1. SQL> SELECT *
  2. 2 FROM (
  3. 3 SELECT C.ID,
  4. 4 C.TWEET_ID,
  5. 5 C.COMMENTS,
  6. 6 C.CREATEDDATE,
  7. 7 ROW_NUMBER() OVER(
  8. 8 PARTITION BY C.TWEET_ID
  9. 9 ORDER BY C.CREATEDDATE DESC
  10. 10 ) AS RN
  11. 11 FROM COMMENTS C
  12. 12 JOIN TWEET T
  13. 13 ON C.TWEET_ID = T.ID
  14. 14 JOIN WRITER W
  15. 15 ON T.WRITER_ID = W.ID
  16. 16 WHERE W.NAME = 'Barack Obama'
  17. 17 )
  18. 18 WHERE RN <= 10;
  19. ID TWEET_ID COMMENTS CREATEDDATE RN
  20. ------ -------- ---------- --------------------------------------------------------------------------- ----------
  21. 1001 100 T1C2 30-JUN-20 03.17.58.000000 PM 1
  22. 1000 100 T1C1 30-JUN-20 02.17.58.000000 PM 2
  23. 2000 101 T2C1 30-JUN-20 02.21.51.000000 PM 1
  24. 2001 101 T2C2 29-JUN-20 02.21.51.000000 PM 2
  25. 2002 101 T2C2 28-JUN-20 02.21.51.000000 PM 3
  26. 2003 101 T2C2 27-JUN-20 02.21.51.000000 PM 4
  27. 2004 101 T2C2 26-JUN-20 02.21.51.000000 PM 5
  28. 2005 101 T2C2 25-JUN-20 02.21.51.000000 PM 6
  29. 2006 101 T2C2 24-JUN-20 02.21.51.000000 PM 7
  30. 2007 101 T2C2 23-JUN-20 02.21.51.000000 PM 8
  31. 2008 101 T2C2 22-JUN-20 02.21.51.000000 PM 9
  32. 2009 101 T2C2 21-JUN-20 02.21.51.000000 PM 10
  33. 12 rows selected.
  34. SQL>
展开查看全部

相关问题