【问题标题】:Count associations in sqlite database query?在 sqlite 数据库查询中计算关联?
【发布时间】:2010-07-29 22:09:52
【问题描述】:

我有一个包含三个表的 sqlite 数据库:Notes、Lists 和 Notes-in-Lists。

Notes 和 Lists 都有一个自动生成的 id 列和一些额外的数据列,例如标题。 Notes-in-Lists 是一个关联表,带有一个自动键和两个指向 Note id 和 List id 的外键。

我有一个查询返回给定列表中的所有笔记:

Select _id, title From Notes
Join Notes_in_Lists On Notes._id=Notes_in_Lists.note_id
Where Notes_in_Lists.list_id=2

例如,这将返回列表 2 中的所有笔记标题和 ID。

但是,笔记可以在多个列表中,我需要能够判断笔记是否与多个列表相关联。这通过在 Notes_in_Lists 表中多次列出的同一 Notes_in_Lists.note_id 来表示。

自己做很容易:

Select Count(note_id) From Notes_in_Lists Where note_id=2

但我需要将上面的两个查询合并为一个查询,我不知道从哪里开始。

编辑
样本数据

Notes:  
_id title  
1   "Note 1"
2   "Note 2" 
3   "Note 3"   
4   "Note 4" 

Note_in_Lists
_id note_id list_id  
1   1       2  
2   1       3  
3   2       2  
4   3       1   
5   4       2  
6   4       4
7   4       5  

示例输出(查询列表 2 的内容):

_id  title      numberOfLists
1    "Note 1"   2
2    "Note 2"   1
4    "Note 4"   3

【问题讨论】:

  • 请提供预期输出的示例。
  • 我认为示例输出可能具有误导性,因为列表 2 中没有“注 4”。

标签: sql database sqlite


【解决方案1】:
Select Notes._id, Notes.title, Count(Nil2.list_id)
From Notes
Inner Join Notes_in_Lists NiL1 On Notes._id=NiL1.note_id
Inner Join Notes_in_Lists NiL2 On Notes._id=NiL2.note_id
Where NiL1.list_id=2
Group By Notes._id, Notes.title;

执行两个连接似乎很浪费,但这就是您基本上运行两个查询所需要的。

【讨论】:

  • 酷。我不知道你可以加入同一张桌子两次。我试试看
  • 至于做两个join,是需要的。我在 android 中工作,两次查询两次获取数据库的闪存读取可能比运行一次稍微复杂一点的查询要慢。
  • 是的,更不用说事后重新组装结果的麻烦了 :)
【解决方案2】:
SELECT n._ID, Title, Count(*) numberOfLists
FROM Notes n, Notes_In_Lists l
where n._id = l.note_id
  AND NOT EXISTS (Select 1 
              from notes_in_lists l2 where 
              l2.note_Id = n._id
              AND l._Id = 2)
group by n._ID, n.Title

【讨论】:

  • 这也会在结果中返回注释 3。我需要排除与列表 2 无关的注释
猜你喜欢
  • 2021-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-20
  • 1970-01-01
  • 2011-08-24
  • 1970-01-01
相关资源
最近更新 更多