我有一个时事通讯组件,用户可以订阅多个时事通讯。它像这样存储在订阅者表中:4、8、11(这些是订阅者订阅的时事通讯的 ID)
要选择我使用的时事通讯的订阅者:
"SELECT * FROM #__newsl_subscribers WHERE newslids LIKE '%" . (int) $id."%'";
当我想选择所有接收 ID 为 1 的时事通讯的用户时,也会选择接收时事通讯 11(或 12、10 等)的用户。这就是问题所在。
这个有选择语句吗?否则我必须用方括号 [1]、[11] 等来存储 id...
最佳答案
您确实应该避免将多个 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>
顺便说一句,我应该为没有回答您最初的问题而道歉。也许您对数据库规范化了如指掌,将这些 ID 存储在一个字段中还有其他原因吗?
关于php - 在数据库中存储和选择多个 ID,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5103629/