-1

我有三张桌子书,会员和贷款。我想查找成员拥有最大书籍数量的书籍的名字、姓氏和标题。我尝试了以下

  1. 为了获得拥有最多记录的成员,我根据 member_id 对记录进行分组,并按顺序递减以获得最大计数。分组记录仅包含一个 member_id(3) 但我希望所有 member_id (2 和 3) 都能获得“书名”,所以我使用 GROUP_CONCAT 来获得它。
SELECT m.firstname, m.lastname, l.member_id, GROUP_CONCAT(l.book_id) as book_id, count(*) as max_c from member m
join loan l
ON m.member_id = l.member_id
group by l.member_id
order by max_c desc limit 1
  1. 然后我尝试使用以下查询获取所需的记录
SELECT m.firstname, m.lastname, b.title from book b
join loan l ON b.book_id = l.book_id
where l.book_id IN
(SELECT m.firstname, m.lastname, l.member_id, GROUP_CONCAT(l.book_id) as book_id, count(*) as max_c from member m
join loan l
ON m.member_id = l.member_id
group by l.member_id
order by max_c desc limit 1)

所需的输出是预期的输出如下所示

firstname   lastname    title
Mark        Sacks       The Cow 
Mark        Sacks       XML for beginners

我正在 sqlfiddle 的 SQLite(SQL.js) 中尝试这个,请帮助我实现这个。

书桌_

book_id     isbn            title               author      publish_year
1           444222666325    Mars                Mark Sas    2001
2           784566512135    The Cow             Williams    1996
3           488984115444    XML for beginners   Jake Snow   2005
4           544465545655    Into Thin Air       Jon Kraka   1990
5           878745656513    And Tango Makes     PeterParnel 1956
6           564564123213    Swimmy  Leo         Lionni      2010
7           132125645678    XML and XQuery      Lee Cakes   2014
8           132154548746    Happy Places        Steve Zus   1998
9           788897998754    The Mascot          Kevin Bacon 1987
10          878561132116    XQuery for begin    Virginia    1800

成员

member_id   lastname    firstname
1001        Smith       John
2123        Sacks       Mark    
3456        Johnson     Susan   
4223        States      Nick    
5987        Stew        Martha  

贷款

member_id   book_id loan_date   due_date
5987           4    2017-09-13  2017-09-30
2123           3    2017-09-13  2017-09-15
4223           9    2017-09-13  2019-09-13
1001           5    2017-10-15  2017-10-19
2123           2    2017-10-15  2017-11-15
4

1 回答 1

1

您想在COUNT这里用作分析函数,保留所有行,然后申请RANK查找排名最高的作者以及所有记录:

WITH cte AS (
    SELECT m.firstname, m.lastname, b.title, COUNT(*) OVER (PARTITION BY m.member_id) cnt
    FROM member m
    INNER JOIN loan l ON l.member_id = m.member_id
    INNER JOIN book b ON b.book_id = l.book_id
),
cte2 AS (
    SELECT *, RANK() OVER (ORDER BY cnt DESC) rnk
    FROM cte
)

SELECT firstname, lastname, title
FROM cte2
WHERE rnk = 1;

下面演示链接的屏幕截图

演示

于 2021-07-01T04:53:32.920 回答