首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择Total和If Read

选择Total和If Read
EN

Stack Overflow用户
提问于 2018-08-15 00:08:06
回答 1查看 33关注 0票数 0

我有以下表格:

代码语言:javascript
复制
Id Title 
1  Test

BookPage (BookId对应于Book表中的Id )

代码语言:javascript
复制
Id BookId Page
1  1      1
1  1      2

BookUserPage (BookPageId对应BookPage表中的Id )

代码语言:javascript
复制
UserId BookPageId
1      1
2      2
3      1

我的select查询如下:

代码语言:javascript
复制
SELECT B.[Id], B.[Title], BP.[Id], BP.[BookId], BP.[Page], COUNT(BUP.[BookpageId]) AS Total
FROM [Book] B
    LEFT OUTER JOIN [BookPage] BP ON BP.[BookId] = B.[Id]
    LEFT OUTER JOIN [BookUserPage] BUP ON BUP.[BookPageId] = BP.[Id]
WHERE B.[Id] = 1
GROUP BY B.[Id], B.[Title], BP.[Id], BP.[BookId], BP.[Page]

我得到的结果如下:

代码语言:javascript
复制
Id, Title, Id, BookId, Page, Total
1   Test   1,  1,      1,    2
1   Test   2,  1,      1,    1

我正在尝试修改查询,以便它也能告诉我用户读取了2个页面中的哪一个。

我尝试过以下几种方法:

代码语言:javascript
复制
SELECT B.[Id], B.[Title], BP.[Id], BP.[BookId], BP.[Page], COUNT(BUP.[BookpageId]) AS Total,
CASE WHEN EXISTS (
    SELECT BUP2.[UserId] 
    FROM [PollUserAnswer] BUP2
    WHERE BUP2.[UserId] = '98ad813b-cd0e-4a63-b40a-e09ee84f4b96')
THEN 1
ELSE 0
END AS Voted
FROM [Book] B
    LEFT OUTER JOIN [BookPage] BP ON BP.[BookId] = B.[Id]
    LEFT OUTER JOIN [BookUserPage] BUP ON BUP.[BookPageId] = BP.[Id]
WHERE B.[Id] = 1
GROUP BY B.[Id], B.[Title], BP.[Id], BP.[BookId], BP.[Page]

但是上面的代码在我的结果中的两行都是1。我还尝试在Case语句中添加一个条件:

代码语言:javascript
复制
AND BUP2.[BookPageId] = BUP.[PageId]

但由于group by的原因,这不能工作,我不能将其列在group by中,因为它是一个子查询。

我对用户1和3的期望输出是这样的:

代码语言:javascript
复制
Id, Title, Id, BookId, Page, Total, Read
1   Test   1,  1,      1,    2,     1
1   Test   2,  1,      1,    1,     0

我对用户2的期望输出是这样的:

代码语言:javascript
复制
Id, Title, Id, BookId, Page, Total, Read
1   Test   1,  1,      1,    2,     0
1   Test   2,  1,      1,    1,     1

注意:请忽略查询输出中有2个Id列的事实。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-08-15 00:18:48

我将连接到单独的子查询,以查找阅读给定页面的用户总数。然后,您只需将另一个左连接添加到BookUserPage上,即可生成Read列:

代码语言:javascript
复制
SELECT b.Id, b.Title, bp.Id, bp.BookId, bp.Page, bup1.total,
    CASE WHEN bup2.UserId IS NULL THEN 0 ELSE 1 END AS [Read]
FROM Book b
LEFT JOIN BookPage bp
    ON bp.BookId = b.Id
LEFT JOIN
(
    SELECT BookPageId, COUNT(*) AS total
    FROM BookUserPage
    GROUP BY BookPageId
) bup1
    ON bup1.BookPageId = bp.Id
LEFT JOIN BookUserPage bup2
    ON bup2.BookPageId = bp.Id AND bup2.UserId = 1
WHERE b.Id = 1;

Demo

这不会生成您期望的结果,但是考虑到您的实际样本数据和连接逻辑,它在逻辑上似乎是正确的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51845622

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档