2013-10-08 2 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는 주어진 하위 ID/typetag 특정있다. 따라서 publisher_feed 테이블의 remote_feed_id와 subid columsn을 수익 통계 테이블의 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

이것은 성취했다. 그것의 def는 어떤 수단으로도 빠른 방법이 아니며 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'; 
관련 문제