Veuillez regarder ce tableau:
mysql> desc s_p;
+-------------------------+------------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+------------------+------+-----+---------+----------------+
| id | int(10) unsigned | NO | PRI | NULL | auto_increment |
| s_pid | int(10) unsigned | YES | MUL | NULL | |
| sm_id | int(10) unsigned | YES | MUL | NULL | |
| m_id | int(10) unsigned | YES | | NULL | |
| created | datetime | YES | | NULL | |
| s_date | datetime | YES | | NULL | |
| estimated_date | datetime | YES | MUL | NULL | |
+-------------------------+------------------+------+-----+---------+----------------+
Jetez maintenant un œil à ces requêtes:
mysql> select count(*) from s_p where estimated_date is null;
+----------+
| count(*) |
+----------+
| 190580 |
+----------+
1 row in set (0.05 sec)
mysql> select count(*) from s_p where estimated_date is not null;
+----------+
| count(*) |
+----------+
| 35640 |
+----------+
1 row in set (0.07 sec)
mysql> select count(*) from s_p;
+----------+
| count(*) |
+----------+
| 1524785 |
+----------+
Les chiffres ci-dessus ne correspondent pas. Selon ma compréhension:
Count with IS NULLet Count with IS NOT NULLdoivent être égaux à count lorsqu'ils sont interrogés sans clause where.
Une idée sur ce qui se passe ici?
================================================== =
Mise à jour du 17 février 2012
Depuis, j'ai constaté que beaucoup de gens se demandent quel type de valeurs a actuellement la date estimée. Voici la réponse:
mysql> select distinct date(estimated_date) from s_p;
+----------------------+
| date(estimated_date) |
+----------------------+
| NULL |
| 2012-02-17 |
| 2012-02-20 |
| 2012-02-21 |
| 2012-02-22 |
| 2012-02-23 |
| 2012-02-24 |
| 2012-02-27 |
| 2012-02-28 |
+----------------------+
9 rows in set (0.42 sec)
Comme vous pouvez le voir ci-dessus, la date_estimée a une valeur NULL ou une valeur datetime valide. Il n'y a pas de zéros ou de chaînes vides "".
Est-ce que cela (problème d'origine) peut se produire si l'index de la date estimée a des problèmes?
================================================== =
Mise à jour du 18 février 2012
Voici la sortie show create table:
| s_p | CREATE TABLE `s_p` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`s_id` int(10) unsigned DEFAULT NULL,
`sm_id` int(10) unsigned DEFAULT NULL,
`m_id` int(10) unsigned DEFAULT NULL,
`created` datetime DEFAULT NULL,
`estimated_date` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `sm_id` (`sm_id`),
KEY `estimated_date_index` (`estimated_date`) USING BTREE,
) ENGINE=InnoDB AUTO_INCREMENT=1602491 DEFAULT CHARSET=utf8 |
Encore une fois, je ne peux que soupçonner l'index de la date estimée ici.
De plus, la version du serveur mysql est 5.5.12.
select count(*)pas et non select count(estimated_date)? Ces deux résultats renverront des résultats différents car les valeurs NULL sont ignorées si c'est la seule chose que vous comptez.
SELECT COUNT(*),SUM(CASE WHEN estimated_date IS NULL THEN 1 ELSE 0 END),SUM(CASE WHEN estimated_date IS NOT NULL THEN 1 ELSE 0 END) from s_plancer : - qui devrait obtenir tous les décomptes en une seule fois.
CHECK TABLE? Compte tenu de la manière extravagante compte complet de la ligne plus grande, je suppose un est DELETEallé quelque part fou.