【发布时间】:2015-11-18 17:07:03
【问题描述】:
我有一个表格:网站、广告系列和 out,用于我正在构建的广告系列跟踪系统。当点击链接时,输出表会在站点 ID 和广告系列 ID 匹配的位置更新其点击数。
在 out 表中有一个campaign_id 和一个site_id,它们分别对应于sites 和campaigns 表。更复杂的是,每个网站可以有 4 个广告系列(campaign_a、campaign_b、campaign_id_reviews、campaign_id_reviews_phone)。我想加入这三个表,并且对于每个站点,我希望以下内容位于一行:
site.site_name, site.campaign_id_a, campaigns.campaign_name, out.hits,
site.campaign_id_b, campaigns.campaign_name, out.hits,
site.campaign_id_reviews, campaigns.campaign_name, out.hits,
site.campaign_id_reviews_phone, campaigns.campaign_name, out.hits
这是我的尝试,它不会带回所有 site_id/campaign_id 组合,它只带回每个 site_id 的一条记录,而不是所有 site_id/campaign_id 组合
SELECT s.*, c.*, o.* FROM sites s
INNER JOIN campaigns c ON s.campaign_id_a=c.campaign_id
INNER JOIN campaigns ON s.campaign_id_b=campaigns.campaign_id
INNER JOIN `out` o ON s.campaign_id_a=o.campaign_id AND s.site_id=o.site_id
WHERE s.site_id NOT IN(100,101)
ORDER BY o.site_id ASC
我的创建表有 3 条记录转储:
CREATE TABLE IF NOT EXISTS `sites` (
`site_id` mediumint(4) NOT NULL AUTO_INCREMENT,
`site_name` varchar(70) NOT NULL,
`campaign_id_a` tinyint(4) NOT NULL,
`campaign_id_b` tinyint(4) NOT NULL,
`a_display_name` varchar(50) NOT NULL,
`b_display_name` varchar(50) NOT NULL,
`campaign_id_reviews` tinyint(4) NOT NULL,
`campaign_id_reviews_phone` tinyint(3) NOT NULL DEFAULT '4',
PRIMARY KEY (`site_id`),
UNIQUE KEY `site_id` (`site_id`),
UNIQUE KEY `site_name` (`site_name`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=102 ;
INSERT INTO `sites` (`site_id`, `site_name`, `campaign_id_a`, `campaign_id_b`, `a_display_name`, `b_display_name`, `campaign_id_reviews`, `campaign_id_reviews_phone`) VALUES
(1, 'example.com', 1, 8, 'hard456', 'easy123', 3, 4),
(2, 'example.org', 1, 8, 'hard456', 'easy123', 3, 4),
(3, 'example.net', 8, 8, 'easy123', 'easy123', 3, 4);
CREATE TABLE IF NOT EXISTS `out` (
`out_id` mediumint(7) NOT NULL AUTO_INCREMENT,
`site_id` tinyint(4) NOT NULL,
`campaign_id` tinyint(4) NOT NULL DEFAULT '0',
`hits` int(11) NOT NULL,
`date_last_hit` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`out_id`),
UNIQUE KEY `site2campaign` (`site_id`,`campaign_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=101 ;
INSERT INTO `out` (`out_id`, `site_id`, `campaign_id`, `hits`, `date_last_hit`) VALUES
(19, 60, 3, 418, '2015-11-16 22:52:33'),
(10, 2, 1, 1135, '2015-11-15 04:51:32'),
(20, 60, 1, 1710, '2015-11-14 13:52:20');
CREATE TABLE IF NOT EXISTS `campaigns` (
`campaign_id` tinyint(4) NOT NULL AUTO_INCREMENT,
`campaign_name` varchar(60) NOT NULL,
`network` varchar(60) NOT NULL,
`url` varchar(400) NOT NULL,
PRIMARY KEY (`campaign_id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=10 ;
INSERT INTO `campaigns` (`campaign_id`, `campaign_name`, `network`, `url`) VALUES
(1, 'Hard456', 'Hard Network', 'exampleURL'),
(3, 'medium678', 'Medium Network', 'examplewithURL'),
(8, 'easy123', 'Easy Network', 'exampleURLLoaction');
(4, 'none23', 'None Network', 'urlExample');
【问题讨论】:
-
您可以尝试使用临时表。会让您的查询看起来更简单。
-
我认为临时表会使高流量数据库上的事情变得复杂,高成本只是为了让它看起来简单。我不知道如何使用临时表来恢复我需要的所有数据
-
课程制作不需要。我只是想更好地了解您的用例。