我有两个有关系的MySQL表有以下问题: 当我想要一个完整列表或按名称或电子邮件等过滤结果时,我可以轻松查询表1(地址) 。但是现在我需要查询表1并根据表2(兴趣)的关系内容对其进行过滤。所以,我需要找到在表1的行(通常是多行)仅在(或更多)的条件在表2中与关系的MySQL过滤器查询
在这里会见是表:
CREATE TABLE IF NOT EXISTS `address` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(100) COLLATE utf8_unicode_ci NOT NULL,
`countryCode` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`languageCode` char(2) COLLATE utf8_unicode_ci DEFAULT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
UNIQUE KEY `emailUnique` (`email`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
INSERT INTO `address` (`id`, `name`, `email`, `countryCode`, `languageCode`, `timestamp`) VALUES
(1, '', '[email protected]', 'BE', 'nl', '2010-07-16 14:07:00'),
(2, '', '[email protected]', 'BE', 'fr', '2010-07-16 14:10:25');
CREATE TABLE IF NOT EXISTS `interests` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`address_id` int(11) unsigned NOT NULL,
`cat` char(2) COLLATE utf8_unicode_ci NOT NULL,
`subcat` char(2) COLLATE utf8_unicode_ci NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`),
KEY `address_id` (`address_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci
INSERT INTO `interests` (`id`, `address_id`, `cat`, `subcat`, `timestamp`) VALUES
(1, 1, 'aa', 'xx', '2010-07-16 14:07:00'),
(2, 1, 'aa', 'yy', '2010-07-16 14:07:00'),
(3, 2, 'aa', 'xx', '2010-07-16 14:07:00'),
(4, 2, 'bb', 'zz', '2010-07-16 14:07:00')
(5, 2, 'aa', 'yy', '2010-07-16 14:07:00');
ALTER TABLE `interests`
ADD CONSTRAINT `interests_ibfk_1` FOREIGN KEY (`address_id`) REFERENCES `address` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION;
例如,我需要找到(有)作为兴趣cat = aa和subcat = xx的地址。或者,另一个例子,我需要的地址(猫)同时感兴趣cat = aa和subcat = xx AND cat = aa和subcat = yy。特别是后者是重要的,必须记住地址和兴趣表将是长列表,并且猫/子猫组合的数量将会变化。我现在正在通过Zend_Db_Table(findDependentRowset)处理参考查询,但是解决方法是减慢地址列表的编号,数字为100甚至1000。
谢谢你的帮助。
欢迎您的精心解答。从某种意义上说,这正是Zend所做的。对于每个地址,检查是否通过findDependentRowset满足条件。但是这些表格太大了,或者更好地说,查询总数需要很长时间。 – Peter 2010-07-27 07:36:33
更正,这比findDependentRowset快得多。我已经运行了一些测试,都使用AND和OR结构,并且他们显示出相当可行的性能,至少在我目前的开发数据库中。我现在正在开会,但稍后会进一步测试。这可能是我的解决方案。 – Peter 2010-07-27 08:12:18