MySQL带有意想不到的结果的奇怪问题

时间:2017-09-11 15:35:05

标签: mysql

我有一个用于报告的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';没有做任何事情

  • REPAIRALTER TABLE t1 ENGINE = InnoDB;没有改变任何内容

我得到的所有DealIds都是我在表格中只有一行的日期。

我通过创建另一个具有完全相同名称的表并执行INSERT INTO new_table SELECT * FROM old_table,截断旧表并从新表中重新插入来修复此问题。

1 个答案:

答案 0 :(得分:0)

您缺少每个值的COUNTdealId = 11983

可能有多行
SELECT dealId, count(*)
FROM report_deal_plac
WHERE date = "2017-09-10"
group by dealId;

你应该看到你正在寻找的结果