“WHERE IN(...)”的替代方案?

时间:2012-06-20 20:45:17

标签: mysql

我有一个正在进行的项目已经失控(在组织良好和深思熟虑方面),因为它开始非常小并且发展得非常快。

无论如何,我们有一个系统跟踪用户活动,记录UUIDS以及我们用于生成有关客户在网站上查看的确切信息的特定联系活动。很标准。无论如何,它变得有点复杂和缓慢,我希望有一些帮助优化查询。

我确信有一种比我目前使用的更好的方法(使用JOINS),但我似乎无法理解它。一些帮助将不胜感激。相关信息如下。

感谢。

表:visitor_activity

CREATE TABLE `visitor_activity` (
 `vaid` int(11) NOT NULL AUTO_INCREMENT,
 `uuid` varchar(128) DEFAULT NULL,
 `ip_address` varchar(15) DEFAULT NULL,
 `datetime` datetime DEFAULT NULL,
 `url` varchar(255) DEFAULT NULL,
 `user_agent` varchar(255) DEFAULT NULL,
 PRIMARY KEY (`vaid`),
 KEY `uuid` (`uuid`),
 KEY `ip_address` (`ip_address`)
) ENGINE=MyISAM AUTO_INCREMENT=70134 DEFAULT CHARSET=utf8

表:contact_uuids

CREATE TABLE `contact_uuids` (
 `contact_id` int(11) NOT NULL DEFAULT '0',
 `uuid` varchar(128) NOT NULL DEFAULT '',
 PRIMARY KEY (`contact_id`,`uuid`),
 KEY `contact_id` (`contact_id`),
 KEY `uuid` (`uuid`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

表:contact_log

CREATE TABLE `contact_log` (
 `contact_log_id` int(11) NOT NULL AUTO_INCREMENT,
 `contact_id` int(11) NOT NULL,
 `datetime` datetime NOT NULL,
 `action` varchar(128) NOT NULL,
 `performed_by` varchar(64) NOT NULL,
 `ip_address` varchar(15) NOT NULL,
 PRIMARY KEY (`contact_log_id`),
 KEY `contact_id` (`contact_id`),
 KEY `ip_address` (`ip_address`),
 KEY `performed_by` (`performed_by`)
) ENGINE=MyISAM AUTO_INCREMENT=9017 DEFAULT CHARSET=utf8

当前SQL语句:

SELECT   DISTINCT(`va`.`vaid`),
         `va`.`datetime`,
         `va`.`uuid`,
         `va`.`ip_address`,
         `va`.`url`
FROM     `visitor_activity` `va`
WHERE    `va`.`uuid` IN (SELECT `uuid` FROM `contact_uuids` `cu` WHERE `cu`.`contact_id` = '1') ||
         `va`.`ip_address` IN (SELECT DISTINCT(`ip_address`) FROM `contact_log` `cl` WHERE `cl`.`contact_id` = '1' && `performed_by` = 'Contact')
ORDER BY `va`.`datetime` DES

1 个答案:

答案 0 :(得分:1)

将您的查询拆分为两个选择以连接不同的表,然后使用union加入所有数据。查询可能如下所示:

(SELECT   DISTINCT(`va`.`vaid`),
     `va`.`datetime`,
     `va`.`uuid`,
     `va`.`ip_address`,
     `va`.`url`
FROM     `visitor_activity` `va`,`contact_uuids` `cu`
WHERE    `va`.`uuid`=`cu`.`uuid`
and `cu`.`contact_id` = '1')
UNION
(SELECT   DISTINCT(`va`.`vaid`),
     `va`.`datetime`,
     `va`.`uuid`,
     `va`.`ip_address`,
     `va`.`url`
FROM  `visitor_activity` `va`,`contact_log` `cl`
where `va`.`ip_address` = `cl`.`ip_address` 
and `cl`.`contact_id` = '1' and `performed_by` = 'Contact')
ORDER BY datetime DESC