SQL, как искать многих на многих отношения

Вы не можете запустить Http.sys в Linux, это вариант размещения только для Windows. См. документацию .

Http.sys тесно связан с Windows (и IIS, который является веб-сервером Microsoft).

Для Linux вы должны использовать Kestrel.

5
задан onedaywhen 21 March 2012 в 10:46
поделиться

7 ответов

Для получения деталей примечаний, которые имеют и маркируют 'One' и 'Two':

select * from notes
where note_id in
( select note_id from labels where label = 'One'
  intersect
  select note_id from labels where label = 'Two'
)
8
ответ дан 13 December 2019 в 22:18
поделиться

Что-то вроде этого... (Вам будет нужна другая таблица ссылки),

SELECT *
FROM Notes n INNER JOIN NoteLabels nl
ON n.noteId = nl.noteId
WHERE nl.labelId in (1, 2)

Править: таблица NoteLabel будет иметь два столбца, noteId и маркированный, с составным PK.

0
ответ дан 13 December 2019 в 22:18
поделиться

Если Вам просто нужен список, можно использовать where exists избегать дублирования. Если у Вас будет несколько тегов против узла в Ваших критериях выбора, то Вы получите дублирующиеся строки в результате. Вот пример where exists:

create table notes (
       NoteID int not null primary key
      ,NoteText varchar (max)
)
go

create table tags (
       TagID int not null primary key
      ,TagText varchar (100)
)
go

create table note_tag (
       NoteID int not null
      ,TagID int not null
)
go

alter table note_tag
  add constraint PK_NoteTag
      primary key clustered (TagID, NoteID)
go

insert notes values (1, 'Note A')
insert notes values (2, 'Note B')
insert notes values (3, 'Note C')

insert tags values (1, 'Tag1')
insert tags values (2, 'Tag2')
insert tags values (3, 'Tag3')

insert note_tag values (1, 1) -- Note A, Tag1
insert note_tag values (1, 2) -- Note A, Tag2
insert note_tag values (2, 2) -- Note B, Tag2
insert note_tag values (3, 1) -- Note C, Tag1
insert note_tag values (3, 3) -- Note C, Tag3
go

select n.NoteID
      ,n.NoteText
  from notes n
 where exists
       (select 1
          from note_tag nt
          join tags t
            on t.TagID = nt.TagID
         where n.NoteID = nt.NoteID
           and t.TagText in ('Tag1', 'Tag3'))


NoteID      NoteText
----------- ----------------
1           Note A
3           Note C
0
ответ дан 13 December 2019 в 22:18
поделиться

Примечание: Я на самом деле не протестировал это. Это также предполагает, что у Вас есть many-many таблица, названная notes_labels, который не может иметь место вообще.

Если Вы просто хотите примечания, которые, имея любую из маркировок, это, что-то вроде этого

SELECT DISTINCT n.id, n.text
FROM notes n
INNER JOIN notes_labels nl ON n.id = nl.note_id
INNER JOIN labels l ON nl.label_id = l.id
WHERE l.label IN (?, ?)

Если Вы хотите примечания, которые имеют ВСЕ маркировки, существует немного дополнительной работы

SELECT n.id, n.text
FROM notes n
INNER JOIN notes_labels nl ON n.id = nl.note_id
INNER JOIN labels l ON nl.label_id = l.id
WHERE l.label IN (?, ?)
GROUP BY n.id, n.text
HAVING COUNT(*) = 2;

? быть заполнителем SQL и 2 являющийся количеством тегов Вы искали. Это предполагает, что таблица ссылки имеет оба столбца ID как составной первичный ключ.

1
ответ дан 13 December 2019 в 22:18
поделиться
select * from notes a
inner join notes_labels mm on (mm.note = a.id and mm.labeltext in ('one', 'two') )

Конечно, замените своими фактическими именами столбцов, надо надеяться, мои предположения о Вашей таблице были корректны.

И на самом деле существует немного возможной неоднозначности в Вашем вопросе благодаря английскому языку и как слово 'и' иногда используется. Если Вы подразумеваете, что хотите видеть, например, примечание отметило 'один', но не 'два', это должно работать (интерпретация Ваш 'и' означать, 'покажите меня все примечания с маркировкой 'один' и/плюс все примечания с маркировкой 'два'). Однако, если Вы только хотите примечания, которые имеют обе маркировки, это было бы одним способом пойти об этом:

select * from notes a
where exists (select 1 from notes_labels b where b.note = a.id and b.labeltext = 'one')
     and exists (select 1 from notes_labels c where c.note = a.id and c.labeltext = 'two')

Править: спасибо за предложения все, механизмы в понедельник в моем мозгу являются немного медленными... похож, у меня должен быть wiki'd он!

1
ответ дан 13 December 2019 в 22:18
поделиться

Принятие Вас имеет нормализованную базу данных, у Вас должна быть другая промежуточная таблица notes и labels

Необходимо затем использовать inner join присоединиться к таблицам вместе

  1. Присоединитесь labels таблица со связывать-таблицей (many-many таблица)
  2. Присоединитесь notes таблица с предыдущим запросом

Пример:

select * from ((labels l inner join labels_notes ln on l.labelid = ln.labelid) inner join notes n on ln.notesid = n.noteid)

Тем путем Вы соединили обе таблицы вместе.

Теперь то, что необходимо добавить, where пункт..., но я оставлю это до Вас.

0
ответ дан 13 December 2019 в 22:18
поделиться

Вы ничего не говорите о том, как эти many-many отношения поняты. Я предполагаю, что таблица маркировок имеет, Маркировки (noteid: интервал, маркировка: varchar) - с первичным ключом, охватывающим обоих?

SELECT DISTINCT n.id from notes as n, notes_labels as nl WHERE n.id = nl.noteid AND nl.text in (label1, label2);

Замените своими именами столбцов и вставьте надлежащих заполнителей для маркировок.

0
ответ дан 13 December 2019 в 22:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: