โปรดดูตารางนี้:
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 | |
+-------------------------+------------------+------+-----+---------+----------------+
ตอนนี้ดูที่การค้นหาเหล่านี้:
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 |
+----------+
จำนวนข้างต้นไม่ตรงกัน ในขณะที่ตามความเข้าใจของฉัน:
นับด้วยIS NULL
และนับด้วยIS NOT NULL
ควรเท่ากับจำนวนเมื่อถูกสอบถามโดยไม่มีตำแหน่ง
ความคิดเกี่ยวกับสิ่งที่เกิดขึ้นที่นี่?
================================================== =
อัพเดทเมื่อวันที่ 17 กุมภาพันธ์ 2555
ตั้งแต่ฉันพบว่าผู้คนจำนวนมากกำลังถามเกี่ยวกับชนิดของค่าที่ประมาณโดยปัจจุบันมี นี่คือคำตอบ:
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)
ดังที่คุณเห็นข้างบนโดยประมาณ_d_dateมีค่า NULL หรือค่า datetime ที่ถูกต้อง ไม่มีเลขศูนย์หรือสตริงว่าง ""
สิ่งนี้ (ปัญหาดั้งเดิม) สามารถเกิดขึ้นได้หรือไม่ถ้าดัชนีในวันที่มีการประมาณมีบางปัญหา
================================================== =
อัพเดทเมื่อวันที่ 18 กุมภาพันธ์ 2555
นี่คือการแสดงสร้างตารางผลลัพธ์:
| 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 |
อีกครั้งฉันสามารถสงสัยได้เฉพาะดัชนีที่ประมาณการณ์แล้วที่นี่
นอกจากนี้เซิร์ฟเวอร์รุ่น mysql คือ 5.5.12
select count(*)
และไม่select count(estimated_date)
? ทั้งสองนี้จะให้ผลลัพธ์ที่แตกต่างกันเนื่องจาก NULL จะถูกละเว้นหากเป็นสิ่งเดียวที่คุณกำลังนับ
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
- ซึ่งควรนับทั้งหมดในครั้งเดียว
CHECK TABLE
บนมันได้หรือไม่? พิจารณาลำพองจำนวนแถวขนาดใหญ่เต็มรูปแบบผมเดาDELETE
ไปที่ไหนสักแห่งบ้า