【问题标题】:SQL statement to return elements from a column only if no elements from a different column match仅当来自不同列的元素不匹配时,SQL 语句才从列中返回元素
【发布时间】:2011-06-28 22:46:07
【问题描述】:

抱歉这个令人困惑的问题,我会尽力澄清。

我有一个 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 应该签名,但没有签名。

对于给定的数据库结构,我尝试做的事情是否可行?如果需要,我可以提供更多详细信息。我不确定需要多少细节。

【问题讨论】:

  • 您可能会考虑尝试构建您的 signoffs_table 以具有 DISTINCT 文档 ID。您可能还会考虑做一些事情来规范化您的数据并摆脱逗号分隔的列表,例如“bob,mary,jim”。

标签: mysql sql database


【解决方案1】:

我猜这个查询就是你的意思:

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 )

【讨论】:

  • 在您的帮助下我成功了,谢谢。我需要真正学习 SQL,但我很少接触这些东西 =)
【解决方案2】:

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

ID  DocumentID  SignerID

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 2023-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多