昨天开贴,问题得到解决。
http://www.iteye.com/problems/47320
写道
系统有个收藏的功能,数据库是这样设计的:
Article (文章表)
ID
Title
Content
Favorite(收藏表)
ID
ArticleID
UserID
User(用户表)
ID
Name
如果有用户收藏文章的话,就向Favorite添加一条数据,如果没有的话就不做任何操作。三个表之间没建立任何关系。
假如现在需要查询用户ID为1收藏的所有内容:
可以这样:select * from Article where ID in(Select ArticleID from Favorite where UserID=1)
现在有个查询需求:
有个页面会把所有的内容都列出来,也就是:select * from Article .
查询出来的内容需要判断用户是否收藏并且做出相应的表示。
我可以直接用:select * from Article ,然后分别对每条结果再查询用户是否收藏过,这样查询就造成了N+1次查询,肯定不合理,不知道是否有其它的查询方式,希望大家帮忙,或者有什么其它的设计。
Article (文章表)
ID
Title
Content
Favorite(收藏表)
ID
ArticleID
UserID
User(用户表)
ID
Name
如果有用户收藏文章的话,就向Favorite添加一条数据,如果没有的话就不做任何操作。三个表之间没建立任何关系。
假如现在需要查询用户ID为1收藏的所有内容:
可以这样:select * from Article where ID in(Select ArticleID from Favorite where UserID=1)
现在有个查询需求:
有个页面会把所有的内容都列出来,也就是:select * from Article .
查询出来的内容需要判断用户是否收藏并且做出相应的表示。
我可以直接用:select * from Article ,然后分别对每条结果再查询用户是否收藏过,这样查询就造成了N+1次查询,肯定不合理,不知道是否有其它的查询方式,希望大家帮忙,或者有什么其它的设计。
最终答案:
写道
select a.ID, a.Title, a.Content, b.ID from Article a left join Favorite b on (a.ID=b.ArticleID and b.UserID=1)
b.ID类为null的则为没有收藏过的,非null的为收藏过的
b.ID类为null的则为没有收藏过的,非null的为收藏过的
因为用hibernate,今天在制作的时候才发现hibernate不支持left join on ,而且我的几个表都没有建立关系,现在就比较麻烦了,怎么把这个sql转换为hsql查询?