SQL / Rails находят записи, где ноль связанных записей находятся в данном состоянии - PullRequest
0 голосов
/ 20 января 2012

Мне нужно найти все записи, которые не имеют связанных записей в любом нескольких состояний.

т.е:.

В проектах есть несколько связанных людей.

Каждый человек может находиться в одном из нескольких различных состояний в отношении Проекта (заинтересованный, участвующий, оставленный, выгнанный, жалованный, законченный и т. Д.).

Итак, чтобы найти список проектов, в которых «никто не работает», мне нужно проверить всех людей, имеющих отношение к проекту, и убедиться, что все они находятся в определенных штатах. Нотабене Это означает, что меня действительно интересует только таблица присоединения People-Project.

Вот где я должен (на основе SQL: выбрать записи, в которых ВСЕ присоединенные записи удовлетворяют некоторому условию ):

SELECT * FROM projects
WHERE NOT EXISTS (
  SELECT NULL FROM people_projects AS pp
  WHERE pp.project_id = projects.id AND (
    pp.state = 'interested' OR
    pp.state = 'left' OR
    pp.state = 'kicked'
  )

Кажется, это работает до некоторой степени, то есть возвращает что-то, а не все. Тем не менее, некоторые возвращенные записи определенно имеют связанные people_projects записи, которые находятся в одном из запрещенных состояний, и есть по крайней мере одна найденная мной запись без people_projects в любом из состояний, которая является не вернулся.

Любой совет высоко ценится.

N.B. Это на самом деле создается через ActiveRecord в проекте Rails 3, но по сути я просто пишу предложение WHERE с нуля. Совсем разные подходы приветствуются! Сейчас я делаю этот пост-запрос фильтрации в Ruby ...

1 Ответ

1 голос
/ 20 января 2012

Это работает для вас? Похож на Exists

SELECT * FROM projects
WHERE id NOT IN (
    SELECT project_id
    FROM people_projects
    WHERE state IN ('interested', 'left', 'kicked')
)
...