リレーションを持つ 2 つの MySQL テーブルで次の問題が発生しています。完全なリストが必要なときにテーブル 1 (アドレス) を簡単にクエリしたり、名前や電子メールなどで結果をフィルタリングしたりできます。しかし、今度はテーブル 1 にクエリを実行し、テーブル 2 のリレーショナル コンテンツ (興味) に基づいてフィルター処理する必要があります。したがって、テーブル 2 で 1 つ (またはそれ以上) の条件が満たされた場合にのみ、テーブル 1 で行 (通常は多くの行) を見つける必要があります。
ここにテーブルがあります:
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, '', 'dummy@test.com', 'BE', 'nl', '2010-07-16 14:07:00'),
(2, '', 'test@somewhere.com', '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 の両方を含むアドレスが必要です。特に後者は重要であり、アドレス テーブルと対象テーブルの両方が長いリストになり、cat/subcat の組み合わせの量が変化することに留意する必要があります。現時点では、Zend_Db_Table (findDependentRowset) を介して参照クエリを使用していますが、その解決策は、数百、さらには数千のヒット数のアドレス リストでは遅くなります。
ご協力ありがとうございました。