2011-02-24 73 views
0

我有一个新闻组组件,用户可以订阅多个新闻组。它存储在这样的用户表:4,8,11(这些是ID的用户订阅该通讯的)存储和选择数据库中的多个ID

要选择通讯我用的用户:

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

当我想选择所有接收id为1的新闻通讯的用户时,也选择接收新闻通讯11(或12,10等)的用户。这就是问题所在。

是否有这样的选择语句?否则,我必须将id放在括号内[1],[11]等等。

+0

为什么哦,为什么哦,为什么哦,为什么人们从未标准化他们的数据库 – 2011-02-24 11:10:15

回答

5

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

我会做到以下几点:

表 “用户”: 有关通讯无信息

表 “通讯”: 关于订户

新表 “newsletter_subscriber”没有相关信息:
Field:subscriber_id
Field: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存储在一个字段中有其他原因吗?

+0

好的,谢谢!那么这意味着要为关系创建一个单独的表格? – Bert 2011-02-24 11:05:48

+0

@Bert - 它的确如此,但从长远来看它会让事情变得如此简单 – 2011-02-24 11:10:48

+0

是的,对于所有n:m情况都是如此。当插入,更新和删除两个表格之间的关系时,这会给您更多的灵活性和稳定性。 – Zeemee 2011-02-24 11:12:43