仅当不同列中的元素不匹配时,SQL语句才能从列返回元素

时间:2011-06-28 14:30:32

标签: mysql sql database

对于令人困惑的问题,我将尽力澄清。

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

我需要的查询是我想在现有数据管理系统上执行的搜索。我想返回给定用户未签名的所有文档,如signoffs_table中的行所示。数据的存储方式类似如下:(这实际上是对实际模式的简化,并隐藏了几个LEFT JOINS和列)

signoffs_table:
| id | user_id | document_id | signers_list |

我的天真解决方案是做以下事情:

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

如果只有Bob签署文件,这是有效的。问题是如果Bob和Mary签署了文档,那么表格如下所示:

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行),因为Bob应该签署一行,但没有。

我想用给定的数据库结构做什么?如果需要,我可以提供更多细节。我不确定需要多少细节。

2 个答案:

答案 0 :(得分:0)

我相信你的设计不正确。您在文档和签名者之间存在多对多关系。你应该有一个联结表,如:

ID  DocumentID  SignerID

答案 1 :(得分: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 )