gpt4 book ai didi

具有关系的MySQL过滤器查询

转载 作者:行者123 更新时间:2023-11-29 05:44:48 26 4
gpt4 key购买 nike

我在 2 个具有关系的 MySQL 表中遇到以下问题:当我想要完整列表或按名称或电子邮件等过滤结果时,我可以轻松查询表 1(地址)。但是现在我需要查询表1,并根据表2的相关内容(兴趣)进行过滤。因此,只有在表 2 中满足一个(或多个)条件时,我才需要在表 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) 处理引用查询,但该解决方案是减慢地址列表编号 100 甚至 1000 次点击的方法。

感谢您的帮助。

最佳答案

SELECT a.name FROM address a
INNER JOIN interests i ON (a.id = i.address_id)
WHERE i.cat = "aa" AND i.subcat IN ('xx', 'yy')

关于具有关系的MySQL过滤器查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3341416/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com