Silakan lihat tabel ini:
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 | |
+-------------------------+------------------+------+-----+---------+----------------+
Sekarang Lihatlah pertanyaan-pertanyaan ini:
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 |
+----------+
Hitungan di atas tidak cocok. Sementara sesuai pemahaman saya:
Hitung dengan IS NULL
dan Hitung dengan IS NOT NULL
harus sama dengan menghitung saat ditanya tanpa klausa mana.
Ada ide tentang apa yang terjadi di sini?
================================================== =
Pembaruan pada 17 Februari 2012
Karena, saya menemukan bahwa banyak orang bertanya tentang jenis nilai yang diestimasi saat ini. Inilah jawabannya:
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)
Seperti yang Anda lihat di atas taksiran tanggal memiliki NULL atau nilai datetime yang valid. Tidak ada nol atau string kosong "".
Bisakah ini (masalah asli) terjadi jika indeks pada estim_date memiliki beberapa masalah?
================================================== =
Pembaruan pada 18 Februari 2012
Ini adalah show create output 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 |
Sekali lagi, saya hanya dapat menduga indeks pada taksiran tanggal di sini.
Juga, versi server mysql adalah 5.5.12.
select count(*)
dan tidak select count(estimated_date)
? Keduanya akan menghasilkan hasil yang berbeda karena NULL diabaikan jika hanya itu yang Anda hitung.
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_p
- yang seharusnya mendapatkan semua jumlah sekaligus.
CHECK TABLE
? Mengingat liar jumlah baris penuh yang lebih besar, aku kira DELETE
pergi ke suatu tempat gila.