2011-06-28 28 views
1

对于令人困惑的问题,我会尽力澄清。仅当来自不同列的元素匹配时才返回列中元素的SQL语句

我有一个SQL数据库(我没有创建),我想写一个查询。我对SQL知之甚少,所以我甚至不知道要搜索什么来查看这个问题是否已经被问到,所以很抱歉。这对于那些知道的人来说应该是一个简单的解决方案。

我需要的查询是针对我希望在现有数据管理系统上执行的搜索。我想返回给定用户未签名的所有文档,如signoffs_table中的行所示。该数据同样存放于如下:(这实际上是实际架构的简化,并隐藏几个LEFT连接和列)

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)因为有一个排鲍勃应该签署,但没有。

是我试图做的可能与给定的数据库结构?如果需要,我可以提供更多细节。我不确定需要多少细节。

+0

你可能看试图建立自己的signoffs_table有DISTINCT文件的ID。你也可以考虑做一些事情来规范你的数据,摆脱逗号分隔的列表,比如“bob,mary,jim”。 – mikeY

回答

0

我想这个查询你的意思:

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

我得到它的工作与你的帮助,谢谢。我需要真正学习SQL,但我只有很少碰过这些东西=) – CodePoet

0

我相信你的设计是不正确的。文档和签名人之间有多对多的关系。你应该有一个结合表,是这样的:

ID DocumentID SignerID 
相关问题