Php 序列化数组字段上的联接表

Php 序列化数组字段上的联接表,php,mysql,sql,join,Php,Mysql,Sql,Join,我使用以下查询从MySQL数据库获取序列化数组: $sql = "SELECT own_addressbooks FROM users_modules WHERE user = ? AND own_addressbooks <> ?"; //result : a:2:{i:0;s:1:"1";i:1;s:1:"2";} 取消序列化我得到的阵列: array(2) { [0]=> string(1)

我使用以下查询从MySQL数据库获取序列化数组:

$sql = "SELECT own_addressbooks 
            FROM users_modules
            WHERE user = ? 
            AND own_addressbooks <> ?";
//result : a:2:{i:0;s:1:"1";i:1;s:1:"2";}
取消序列化我得到的阵列:

 array(2) { [0]=> string(1) "1" [1]=> string(1) "2" }
其中,数组的每个字段都是下表中的一行:

CREATE TABLE IF NOT EXISTS `users_modules` (
  `user` int(11) NOT NULL AUTO_INCREMENT,
  `own_groups` text NOT NULL,
  `read_groups` text NOT NULL,
  `modify_groups` text NOT NULL,
  `own_mails` text NOT NULL,
  `read_mails` text NOT NULL,
  `own_calendars` text NOT NULL,
  `modify_calendars` text NOT NULL,
  `read_calendars` text NOT NULL,
  `own_addressbooks` text,
  `modify_addressbook` text NOT NULL,
  `read_addressbooks` text NOT NULL,
  PRIMARY KEY (`user`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;
CREATE TABLE IF NOT EXISTS `addressbooks` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `title` varchar(100) COLLATE utf8_bin NOT NULL,
  `entries` text COLLATE utf8_bin NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_bin AUTO_INCREMENT=2 ;

是否有通过联接查询获得每个通讯簿标题的方法?或者顺便问一下,这样做的最佳方式是什么?

您应该在addressbooks表中添加一个用户id,告诉谁拥有地址簿,并完全跳过序列化的own\u addressbooks。这样,您就可以加入并查找用户拥有的所有通讯簿。如果一个地址簿可以由多个用户拥有,那么您需要一个额外的表来关联它们。嗯,如果我有10000个地址簿,会发生什么?就性能而言,我不认为检查9000条记录以查找存储在第9001行的通讯簿是好的…通过对数据库进行正确的索引,对单个行进行SQL搜索,它仍然比将所有数据发送到PHP、反序列化快得多,搜索并向数据库发送另一个查询往返以获取实际行。也就是说,如果您将所有行提取到PHP以比较它们,而不是使用SQL进行搜索,您将不会获得太多的收益。非常感谢。