我有一个用于报告的MySQL表,引擎是innoDB,并且有一些分区:/ *!50100 PARTITION BY HASH(年(日期)* 12 +月(日期)) PARTITIONS 48 * /
该表有一个日期字段,一个dealId字段,一个placementId字段(以及一些指标列)。
我有一个2017年10月10日的交易日期:
select count(*) from report_deal_plac where date = "2017-09-10" and dealId = 11983;
+----------+
| count(*) |
+----------+
| 96 |
+----------+
1 row in set (0.00 sec)
但是当我试图获得这个日期的所有dealId时,我无法找到这个dealId:
SELECT DISTINCT(dealId) FROM report_deal_plac WHERE date = "2017-09-10";
+--------+
| dealId |
+--------+
| 1938 |
| 3620 |
| 5892 |
| 6360 |
| 6814 |
| 8928 |
| 9010 |
| 9193 |
| 9282 |
| 9583 |
| 9676 |
| 10129 |
| 10300 |
| 10615 |
| 10858 |
| 11259 |
| 11388 |
| 11563 |
+--------+
18 rows in set (0.00 sec)
我尝试使用group by,以防我遇到明显的问题,但它没有帮助:
SELECT dealId FROM report_deal_plac WHERE date = "2017-09-10" group by dealId;
+--------+
| dealId |
+--------+
| 1938 |
| 3620 |
| 5892 |
| 6360 |
| 6814 |
| 8928 |
| 9010 |
| 9193 |
| 9282 |
| 9583 |
| 9676 |
| 10129 |
| 10300 |
| 10615 |
| 10858 |
| 11259 |
| 11388 |
| 11563 |
+--------+
使用where子句不会有任何帮助:
SELECT DISTINCT(dealId) FROM report_deal_plac WHERE date = "2017-09-10" and dealId = 11983;
Empty set (0.00 sec)
我做了一个CHECK TABLE,说它没关系。我尝试了一个OPTIMIZE表(它确实重新创建了+ analyze,并且得到了一个OK结果)。但这没有任何帮助。
问题可能来自哪里?
以下是表格定义:
CREATE TABLE `report_deal_plac` (
`date` date NOT NULL,
`dealId` int(11) NOT NULL,
`placementId` int(11) NOT NULL,
`impressions` int(11) NOT NULL,
`impressionsKept` int(11) NOT NULL,
`impressionsResold` int(11) NOT NULL,
`dollarRevenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
`revenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
`netDollarRevenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
`netRevenue` decimal(12,6) NOT NULL DEFAULT '0.000000',
`impressionsMeasured` int(11) DEFAULT '0',
`impressionsViewed` int(11) DEFAULT '0',
`impressionsSoldMeasured` int(11) DEFAULT '0',
`impressionsSoldViewed` int(11) DEFAULT '0',
`clicks` int(11) DEFAULT '0',
PRIMARY KEY (`date`,`dealId`,`placementId`),
KEY `dealid` (`dealId`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
/*!50100 PARTITION BY HASH ( YEAR(date) * 12 + MONTH(date))
PARTITIONS 48 */
以下是我的查询的EXPLAIN PARTITIONS
explain partitions select DISTINCT(dealId) FROM report_deal_plac WHERE date = '2017-09-10';
+----+-------------+------------------+------------+-------+----------------+--------+---------+------+------+---------------------------------------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------------+-------+----------------+--------+---------+------+------+---------------------------------------+
| 1 | SIMPLE | report_deal_plac | p21 | range | PRIMARY,dealid | dealid | 4 | NULL | 533 | Using where; Using index for group-by |
+----+-------------+------------------+------------+-------+----------------+--------+---------+------+------+---------------------------------------+
更新:对于这个结局:
使用BETWEEN '2017-09-10' AND '2017-09-11'
工作(第11天根本没有数据)。我不知道为什么。 (BETWEEN '2017-09-10' AND '2017-09-10'
没有工作)
使用GROUP BY
工作的聚合函数
SET optimizer_switch = 'index_merge_intersection=off';
没有做任何事情
REPAIR
或ALTER TABLE t1 ENGINE = InnoDB;
没有改变任何内容
我得到的所有DealIds都是我在表格中只有一行的日期。
我通过创建另一个具有完全相同名称的表并执行INSERT INTO new_table SELECT * FROM old_table
,截断旧表并从新表中重新插入来修复此问题。
答案 0 :(得分:0)
您缺少每个值的COUNT
。 dealId = 11983
SELECT dealId, count(*)
FROM report_deal_plac
WHERE date = "2017-09-10"
group by dealId;
你应该看到你正在寻找的结果