2013-10-08 5 views
1

MySql Правильно Присоединиться к сложным данным/таблицам

Каждому клиенту предоставляется конкретный XML-фид (таблица publisher_feed). Каждый раз, когда есть запрос или клик по этому каналу, он записывается (таблица publisher_stats_raw) (каждый запрос/клик будет иметь несколько строк в зависимости от субада, переданного клиентом (мы можем суммировать клики вместе)). На следующий день мы вытаскиваем статистику из API, чтобы получить данные о доходах предыдущих дней (таблица rev_stats) (каждый показатель дохода может иметь несколько строк в зависимости от страны клика (мы можем суммировать доход вместе)). С трудом пытались связать эти три таблицы, чтобы найти средний RPC для каждого клиента за предыдущий день.

Структура таблицы:

CREATE TABLE `publisher_feed` (
    `publisher_feed_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `alias` varchar(45) DEFAULT NULL, 
    `user_id` int(10) unsigned DEFAULT NULL, 
    `remote_feed_id` int(10) unsigned DEFAULT NULL, 
    `subid` varchar(255) DEFAULT '', 
    `requirement` enum('tq','tier2','ron','cpv','tos1','tos2','tos3','pv1','pv2','pv3','ar','ht') DEFAULT NULL, 
    `status` enum('enabled','disabled') DEFAULT 'enabled', 
    `tq` decimal(4,2) DEFAULT '0.00', 
    `clicklimit` int(11) DEFAULT '0', 
    `prev_rpc` decimal(20,10) DEFAULT '0.0000000000', 
    PRIMARY KEY (`publisher_feed_id`), 
    UNIQUE KEY `alias_UNIQUE` (`alias`), 
    KEY `publisher_feed_idx` (`remote_feed_id`), 
    KEY `publisher_feed_user` (`user_id`), 
    CONSTRAINT `publisher_feed_feed` FOREIGN KEY (`remote_feed_id`) REFERENCES `remote_feed` (`remote_feed_id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
    CONSTRAINT `publisher_feed_user` FOREIGN KEY (`user_id`) REFERENCES `user` (`user_id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=124 DEFAULT CHARSET=latin1$$ 



CREATE TABLE `publisher_stats_raw` (
    `publisher_stats_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `unique_data` varchar(350) NOT NULL, 
    `publisher_feed_id` int(10) unsigned DEFAULT NULL, 
    `date` date DEFAULT NULL, 
    `subid` varchar(255) DEFAULT NULL, 
    `queries` int(10) unsigned DEFAULT '0', 
    `impressions` int(10) unsigned DEFAULT '0', 
    `clicks` int(10) unsigned DEFAULT '0', 
    `filtered` int(10) unsigned DEFAULT '0', 
    `revenue` decimal(20,10) unsigned DEFAULT '0.0000000000', 
    PRIMARY KEY (`publisher_stats_id`), 
    UNIQUE KEY `unique_data_UNIQUE` (`unique_data`), 
    KEY `publisher_stats_raw_remote_feed_idx` (`publisher_feed_id`) 
) ENGINE=InnoDB AUTO_INCREMENT=472 DEFAULT CHARSET=latin1$$ 




CREATE TABLE `rev_stats` (
    `rev_stats_id` int(10) unsigned NOT NULL AUTO_INCREMENT, 
    `date` date DEFAULT NULL, 
    `remote_feed_id` int(10) unsigned DEFAULT NULL, 
    `typetag` varchar(255) DEFAULT NULL, 
    `subid` varchar(255) DEFAULT NULL, 
    `country` varchar(2) DEFAULT NULL, 
    `revenue` decimal(20,10) DEFAULT NULL, 
    `tq` decimal(4,2) DEFAULT NULL, 
    `finalized` int(11) DEFAULT '0', 
    PRIMARY KEY (`rev_stats_id`), 
    KEY `rev_stats_remote_feed_idx` (`remote_feed_id`), 
    CONSTRAINT `rev_stats_remote_feed` FOREIGN KEY (`remote_feed_id`) REFERENCES `remote_feed` (`remote_feed_id`) ON DELETE NO ACTION ON UPDATE NO ACTION 
) ENGINE=InnoDB AUTO_INCREMENT=58 DEFAULT CHARSET=latin1$$ 

Контекст:

Каждый remote_feed имеет удельную SubID/typetag дано ему. Таким образом, нам нужно сопоставить как remote_feed_id, так и субидные columsn из таблицы publisher_feed с столбцами remote_feed_id и typetag в таблице статистики доходов.

Моя текущая, нерабочем, реализация:

SELECT 
    pf.publisher_feed_id, psr.date, sum(clicks), sum(rs.revenue) 
FROM 
    xml_network.publisher_feed pf 
JOIN 
    xml_network.publisher_stats_raw psr 
ON 
    psr.publisher_feed_id = pf.publisher_feed_id 
JOIN 
    xml_network.rev_stats rs 
ON 
    rs.remote_feed_id = pf.remote_feed_id 
WHERE 
    pf.requirement = 'tq' 
AND 
    pf.subid = rs.typetag 
AND 
    psr.date <> date(curdate()) 
GROUP BY 
    psr.date 
ORDER BY 
    psr.date DESC 
LIMIT 1; 

выше продолжает тянуть неправильные данные из таблицы rev_stats (тянет сумму правильной статистики, но повторяет его по причине объединения). Любая помощь в том, как я мог бы правильно вытащить правильные данные, был бы очень полезен (я мог бы использовать несколько запросов и PHP, чтобы получить правильные результаты, но что в этом хорошего!)

ответ

0

Выяснил способ получить это достигнуто. Его определение не является быстрым методом любыми способами, для чего требуется 4 выбора, но он работает безупречно =)

SELECT 
     pf.publisher_feed_id, 

     round(
       (
         SELECT 
           SUM(rs.revenue) 
         FROM 
           xml_network.rev_stats rs 
         WHERE 
           rs.remote_feed_id = pf.remote_feed_id 
         AND 
           rs.typetag = pf.subid 
         AND 
           rs.date = subdate(current_date, 1) 

       ),10)as revenue, 
       (
         SELECT 
           MAX(rs.tq) 
         FROM 
           xml_network.rev_stats rs 
         WHERE 
           rs.remote_feed_id = pf.remote_feed_id 
         AND 
           rs.typetag = pf.subid 
         AND 
           rs.date = subdate(current_date, 1) 

       ) as tq, 
       (
         SELECT 
           SUM(psr.clicks)-SUM(psr.filtered) 
         FROM 
           xml_network.publisher_stats_raw psr 
         WHERE 
           psr.publisher_feed_id = pf.publisher_feed_id 
         AND 
           psr.date = subdate(current_date, 1) 

       ) as clicks 
FROM 
     xml_network.publisher_feed pf 

WHERE 
     pf.requirement = 'tq'; 
Смежные вопросы