Оператор SQL для возврата элементов из столбца, только если ни один элемент из другого столбца не соответствует - PullRequest
1 голос
/ 28 июня 2011

Извините за запутанный вопрос, я попытаюсь уточнить.

У меня есть база данных SQL (которую я не создал), для которой я хотел бы написать запрос.Я очень мало знаю о SQL, поэтому мне трудно даже знать, что искать, чтобы увидеть, был ли уже задан этот вопрос, так что извините, если он задан.Это должно быть простое решение для тех, кто в курсе.

Мне нужен запрос на поиск, который я хотел бы выполнить в существующей системе управления данными.Я хочу вернуть все документы, на которых данный пользователь НЕ подписан, как указано в строках в signoffs_table.Данные хранятся аналогично следующему: (это на самом деле упрощение реальной схемы и скрывает несколько левосторонних соединений и столбцов)

signoffs_table:
| id | user_id | document_id | signers_list |

Наивное решение, которое у меня было, заключалось в следующем:

SELECT document_id from signoffs_table WHERE (user_id <> $BobsID) AND signers_list LIKE "%Bob%";

Это работает, если только Боб подписывает документ.Проблема в том, что если Боб и Мэри подписали документ, то таблица выглядит следующим образом:

signoffs_table:
-----------------------------------------------
| id | user_id | document_id | signers_list   |
-----------------------------------------------
| 1  | 10      | 100         | "Bob,Mary,Jim" |
| 2  | 20      | 100         | "Bob,Mary,Jim" |
-----------------------------------------------

(assume Bob's ID = 10 and mary's ID = 20). 

, а затем, когда я делаю запрос, я возвращаю document_id 100 (в строке # 2), потому чтострока, которую Боб должен был подписать, но не подписал.

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

Ответы [ 2 ]

0 голосов
/ 28 июня 2011

Полагаю, вы имеете в виду этот запрос:

SELECT document_id FROM signoffs_table AS t1
WHERE signers_list LIKE "%Bob%"
AND NOT EXISTS (
    SELECT 1 FROM signoffs_table AS t2
    WHERE (t2.user_id = $BobsID) AND t2.document_id = t1.document_id )
0 голосов
/ 28 июня 2011

Я считаю, что ваш дизайн неверен.У вас есть отношения многие ко многим между документами и подписавшими.Вы должны иметь соединительную таблицу, что-то вроде:

ID  DocumentID  SignerID
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...