在数据库中存储和选择多个ID

时间:2011-02-24 10:53:51

标签: php mysql database

我有一个简报组件,用户可以订阅多个简报。它存储在订阅者的表中,如下所示:4,8,11(这些是订阅者订阅的新闻简报的ID)

要选择我使用的简报的订阅者:

"SELECT * FROM #__newsl_subscribers WHERE newslids LIKE '%" . (int) $id."%'";

当我想选择接收ID为1的简报的所有用户时,也会选择接收简报11(或12,10等)的用户。这就是问题所在。

这是否有选择声明?否则我必须在它们周围存储带括号的id [1],[11]等......

1 个答案:

答案 0 :(得分:5)

你真的应该避免在一个字段中存储多个ID的解决方案。相反,您应该使用外键,就像在n:m关系中的情况一样,使用关系表。 n:m关系是这些 a 可以有多个 b ,反之亦然。

我会做以下事情:

表“订户”: 没有关于时事通讯的信息

表“简报”: 没有关于订阅者的信息

新表“newsletter_subscriber”
字段:subscriber_id
字段:newsletter_id
这两个字段都是外键(对另一个表的主键的引用)。

要选择特定时事通讯的所有订阅者,您可以使用以下声明:

SELECT s.* FROM subscriber s
INNER JOIN newsletter_subscriber ns ON ns.subscriber_id = s.id
WHERE ns.newsletter_id = <newsletter id>

反之亦然,选择特定订户的所有简报:

SELECT n.* FROM newsletter n
INNER JOIN newsletter_subscriber ns ON ns.newsletter_id = n.id
WHERE ns.subscriber_id = <subscriber id>

BTW我应该为没有回答你原来的问题而道歉。也许你知道关于数据库规范化的一切,还有其他原因将这些id存储在一个字段中?