如何严格包含SQL查询结果

如何严格包含SQL查询结果,sql,Sql,我正在编写一个应用程序,它通过数据库中的“memos”表实现一个消息系统。该表有几个字段,如下所示: id, date_sent, subject, senderid, recipients,message, status 当有人发送新备忘录时,它将被输入备忘录表。备忘录可以同时发送给多个人,收件人用户ID将以逗号分隔的值插入“收件人”字段 这样的SQL查询似乎可以用来查看备忘录中是否包含特定的用户ID: SELECT * FROM memos WHERE recipients LIKE %1

我正在编写一个应用程序,它通过数据库中的“memos”表实现一个消息系统。该表有几个字段,如下所示:

id, date_sent, subject, senderid, recipients,message, status
当有人发送新备忘录时,它将被输入备忘录表。备忘录可以同时发送给多个人,收件人用户ID将以逗号分隔的值插入“收件人”字段

这样的SQL查询似乎可以用来查看备忘录中是否包含特定的
用户ID

SELECT * FROM memos WHERE recipients LIKE %15%
但我不确定这是正确的解决方案。如果我使用上面的SQL语句,它不会返回“包含”15的所有内容吗?例如,使用上述语句,用户15、1550、1564、2015都将包含在结果集中(这些用户可能实际上不在收件人列表中)


解决这一问题的最佳方法是什么?如果用户15位于收件人字段中,那么只有用户15被拉入,而不是包含15的所有内容?我是不是误解了类似的说法?

我认为你最好将收件人作为备忘录表的子表。因此,您的备忘表有一个备忘ID,它被子表引用为

MemoRecipients
-----
MemoRecipientId INT PRIMARY KEY, IDENTITY,
MemoId INT FK to memos NOT NULL
UserId INT NOT NULL
对于查询用户的特定备忘录,您可以执行以下操作

SELECT *
FROM MEMOS m
INNER JOIN memoRecipients mr on m.Id = mr.memoId
WHERE userId = 15

我不确定应用程序究竟是如何提取这些消息的,但我认为更好的方法是创建一个表
message\u recepient
,它将表示收件人和备忘录之间的多对多关系

id, memoId, recepientId
然后您的应用程序可以提取这样的消息

SELECT m.* 
FROM memos m inner join message_recepient mr on m.id = mr.memoId
WHERE recepientId = 15
这样您将获得特定用户的消息。同样,不知道您的
状态
字段用于什么,但如果这是用于
新建/已读/未读
,您可以在where中添加

and m.status = 'new'
Order by date_set desc

这样你就可以积累信息,那些新的信息。不,你不会被误解,这就是
的工作原理。。但是为了实现您想要的,最好不要将收件人合并到一个字段中。相反,尝试创建单独的表,保存每个备忘录的收件人列表

对于我,我将使用以下模式,以满足您的需要:

Table_Memo
id, date_sent, subject, senderid, message, status

Table_Recipient
id_memo FK Table_Memo(id), recipient
这样,如果您想从备忘录中获取特定收件人,您可以执行以下查询:

SELECT a.* FROM Table_Memo a, Table_Recipient b 
WHERE a.id = "memo_id" AND a.id = b.id_memo AND b.recipient LIKE %15%

如果您真的需要保持当前的结构,您可以确保即使是userId列表中的最后一个元素也有一个逗号,并检查%15、%(我不记得是否需要转义逗号,但我建议不要使用此方法,因为提供的答案是规范化的