简体   繁体   中英

MySql Properly Join Complex Data/Tables

Abstract:

Every client is given a specific xml ad feed (publisher_feed table). Everytime there is a query or a click on that feed, it gets recorded (publisher_stats_raw table) (Each query/click will have multiple rows depending on the subid passed by the client (We can sum the clicks together)). The next day, we pull stats from an API to grab the previous days revenue numbers (rev_stats table) (Each revenue stat might have multiple rows depending on the country of the click (We can sum the revenue together)). Been having a hard time trying to link together these three tables to find the average RPC for each client for the previous day.

Table Structure:

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$$

Context:

Each remote_feed has a specific subid/typetag given to it. So we need to match up the both the remote_feed_id and the subid columsn from the publisher_feed table to the remote_feed_id and typetag columns in the revenue stats table.

My current, non working, implementation:

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;

The above keeps pulling the wrong data out of the rev_stats table (pulls the sum of the correct stats, but repeats it over because of a join). Any help with how I would be able to properly pull the correct data would be greatly helpful ( I could use multiple queries and PHP to get the correct results, but what's the fun in that!)

Figured out a way to get this accomplished. Its def not a fast method by any means, needing 4 selects to get it done, but it works flawlessly =)

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';

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM