对于令人困惑的问题,我将尽力澄清。
我有一个我想编写查询的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应该签署一行,但没有。
我想用给定的数据库结构做什么?如果需要,我可以提供更多细节。我不确定需要多少细节。
答案 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 )