Количество ассоциаций в запросе к базе данных sqlite? - PullRequest
1 голос
/ 28 июля 2010

У меня есть база данных sqlite с тремя таблицами: заметки, списки и заметки в списках.

И заметки, и списки имеют автоматически генерируемый столбец идентификаторов и некоторые дополнительные столбцы данных, такие как заголовок. Notes-in-Lists - это таблица ассоциации с автоматическим ключом и двумя внешними ключами, которые указывают на идентификатор заметки и идентификатор списка.

У меня есть запрос, который возвращает все заметки в данном списке:

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.

Однако заметки могут быть в нескольких списках, и мне нужно иметь возможность определить, связана ли заметка с несколькими списками. На это указывает один и тот же Notes_in_Lists.note_id, который несколько раз указан в таблице Notes_in_Lists.

Достаточно легко сделать само по себе:

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 ]

2 голосов
/ 29 июля 2010
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;

Выполнение двух объединений может показаться расточительным, но для этого вам необходимо выполнить два запроса.

0 голосов
/ 28 июля 2010
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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...