SQL получает пользователей по одной группе и добавочной позиции - PullRequest
0 голосов
/ 27 марта 2019

У меня есть две таблицы - таблица users и таблица group.

Пользователи однозначно идентифицируются как user_id в таблице users, но могут иметь несколько записей в group table.

Таблица групп определяет, в каком group каждом пользователе находятся столбцы name и user_id.

Записи в таблице group имеют position столбец, представляющий собой целое число, которое вручную увеличивается для каждой записи пользователя.

Я пытаюсь написать запрос, который возвращает всех пользователей в имени группы A, у которых нет группы B какследующий инкрементный номер, который был в столбце position записи группы A.

Другими словами, все записи, которые находятся в группе A в любом position, должны иметь последующую записьв группе B следующим шагом position.Я хочу найти все записи, где это НЕ соответствует действительности.

GROUPS TABLE

| user_id       | name          | position  |
| ------------- |:-------------:| ---------:|
| 1             | A             | 14        |
| 1             | B             | 15        |
| 2             | A             | 22        |
| 2             | B             | 24        |
| 2             | C             | 23        | <-- Query Should return this row

Пока что я могу получить пользователей, которые находятся в группе A, а не B, но я не знаюкак выполнить позиционную часть, так как я считаю, что она должна использовать какую-то переменную или что-то в этом роде.

Это то, что я имею до сих пор.

SELECT DISTINCT user_id
FROM groups g
WHERE 
  exists (
    SELECT 1 from groups WHERE user_id = g.user_id AND name = 'A'
  )
  and not exists (
    SELECT 1 from groups WHERE user_id = g.user_id AND name != 'B'
  )

Ответы [ 2 ]

1 голос
/ 27 марта 2019

Я бы использовал left join:

select g.*
from groups g left join
     groups gb
     on gb.user_id = g.user_id and
        gb.position = g.position + 1 and
        gb.name = 'B'
where g.name = 'A' and gb.name is null;
0 голосов
/ 27 марта 2019

Я пытаюсь написать запрос, который возвращает всех пользователей в имени группы A, которые не имеют группу B в качестве следующего добавочного номера, который был в столбец позиции группы A запись

С NOT EXISTS:

SELECT *
FROM groups g
WHERE
  name = 'A'
  AND
  NOT EXISTS (
    SELECT 1 from groups 
    WHERE 
      user_id = g.user_id 
      AND 
      name = 'B' 
      AND 
      position = (select min(position) from groups where position > g.position)
  ) 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...