2012-06-20 86 views
0

我已經有一個項目正在進行中,因爲它開始非常小,並且增長得非常快,所以這個項目已經有點失控(就組織性和想法而言)。「WHERE IN(...)」的替代品?

無論如何,我們有一個跟蹤用戶活動,記錄UUIDS以及我們用來生成關於客戶在網站上查看的具體聯繫活動的系統。相當標準。無論如何,它變得有點複雜和緩慢,我希望有一些幫助優化查詢。

我確定有更好的方法來做到這一點(使用連接也許)比我目前使用,但我似乎無法得到我的頭。一些幫助將不勝感激。相關信息如下。

謝謝。

表: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

分割你兩個選擇查詢,以便不同的表,然後用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 
+0

完美,謝謝。我應該能夠看到這一點。歡呼男人。 –