繁体   English   中英

MySql正确连接复杂的数据/表

[英]MySql Properly Join Complex Data/Tables

抽象:

每个客户都有一个特定的xml广告供稿(publisher_feed表)。 每次对该Feed进行查询或单击时,都会对其进行记录(publisher_stats_raw表)(每次查询/单击都会有多行,具体取决于客户端传递的subid(我们可以将这些点击加在一起))。 第二天,我们从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。 因此,我们需要将publisher_feed表中的remote_feed_id和subid列与收入统计表中的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来获取正确的结果,但是这样做的乐趣是什么!)

想出一种方法来实现这一目标。 它的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';

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

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