สอบถามการนับจำนวน และแยกประเภทโดยใช้คำสั่ง sql select และ คิวรี่ครั้งเดียวครับ.

ถาม-ตอบ แนะนำไอเดียว โค้ดตัวอย่าง แนวทาง วิธีแก้ปัญหา สอบถามการนับจำนวน และแยกประเภทโดยใช้คำสั่ง sql select และ คิวรี่ครั้งเดียวครับ.

สอบถามการนับจำนวน และแยกประเภทโดยใช้คำสั่ง sql select และ คิวรี่ครั้งเดียวครับ.


จากตาราง student  ด้านบน
สมมุติว่าเราจะทำหน้าสรุปรายงานดังนี้
  • ระบุจังหวัด    กรุงเทพ =  4 คน,   สมุทรปราการ = 2 คน, อื่น ๆ = 2   (ซึ่งหมายถึง นครปฐม = 1และปทุมธานี = 1 คนแต่ให้นับรวมกันเป็นอื่น ๆ )
  • ระบุระดับชั้น    อนุบาล =  3 คน, ประถมศึกษา = 5 คน
  • ระบุสี     สีแดง =  2 คน, สีชมพู = 4 คน, สีฟ้า = 2 คน
  • ระบุจำนวน    นักเรียนทั้งหมด =  8 คน
เราควรต้องใช้คำสั่ง sql หรือ count แบบไหนได้บ้างครับที่จะเหมาะสมและกระชับที่สุดยกเว้น select แบบมีเงื่อนไขหลาย ๆ ครั้ง แล้วก็ใช้ num row 
แบบว่าให้คิวรี่และ mysql_fetch_array ครั้งเดียวแล้วสั่ง echo ได้เลย.

ที่คิดออกตอนนี้คือ
select * from student where province = 'กรุงเทพ'  แล้วก็ใช้  num row นับแถวเอา
ส่วนข้อมูลอื่น ๆ และฟิลด์อื่น ๆ ก็ทำเช่นกัน
แต่มาคิดดููแล้วมันน่าจะไม่ใช่วิธีที่ถูกต้อง
จึงได้สอบถามมาครับ.



Giggstar 30-10-2018 13:03:04

คำแนะนำ และการใช้งาน

สมาชิก กรุณา ล็อกอินเข้าระบบ เพื่อตั้งคำถามใหม่ หรือ ตอบคำถาม สมาชิกใหม่ สมัครสมาชิกได้ที่ สมัครสมาชิก


  • ถาม-ตอบ กรุณา ล็อกอินเข้าระบบ
  • เปลี่ยน


    ( หรือ เข้าใช้งานผ่าน Social Login )

 ความคิดเห็นที่ 1
ถ้าต้องการข้อมูลสุดท้าย จากการ query คำสั่งเดียว เราจำเป็นต้องจัดรูปแบบข้อมูล
ที่ต้องการ หรือโครงสร้างผลลัพธ์ที่ต้องการในรูปแบบของตารางก่อน
อย่างในที่นี้ เรามีข้อมูลอยู่ 4 แบบ 
- จังหวัด
- ระดับชั้น
- สี
- จำนวน
ส่วนนี้เรากำหนดฟิลด์เป็น section และให้ค่าเป็น 1,2,3 และ 4 ตามลำดับ
ต่อไปส่วนของ ชื่อข้อมูลที่เราจะนับ เราให้ฟิลด์เป็น title ค่าก็จะเป็น ชื่อจังหวัด ชื่อระดับชั้น
ชื่อสี และชื่อจำนวนทั้งหมด
และส่วนสุดท้าย จะเป็นจำนวนของข้อมูลแยกตามชื่อข้อมูล
โครงสร้างตาราง ตัวอย่าง ก็จะเได้เป็น
section title num
1 กรุงเพท 4
1 สมุทรปราการ 2
3 แดง 2
 
ดังนั้นรูปแบบคำสั่งที่เราต้องการคือ
 
SELECT
section,
title,
num
FROM tbl_demo3
 
แต่ฟิลด์ข้างต้นไม่มีในตาราง ดังนั้นเราจึงใช้เป็นชื่อเรียกแทน ก็จะเป็น
 
SELECT
xxx as section,
xxx as title,
xxx as num
FROM tbl_demo3
 
ต่อไปให้เราไล่ข้อมูลแต่ละชุดที่เราอยากได้ กรณีแรก จังหวัด เนื่องจากเป็นการนับจำนวน
แบบบจัดกลุ่มอีกที จึงใช้ GROUP BY ฟิลด์ที่จะนับ
 
SELECT
1 as section,
province as title,
COUNT(id) as num
FROM tbl_demo3
GROUP BY province
 
จะเห็นว่ากรณีแรกเราฟิกค่าให้กับฟิลด์ section เป็น 1 และข้อมูล title เราใช้ค่าจากฟิลด์ province
 
ทำลักษณะเดียวกับ ระดับชั้นและสี จะได้เป็น
 
SELECT
2 as section,
class as title,
COUNT(id) as num
FROM tbl_demo3
GROUP BY class
 
SELECT
3 as section,
color as title,
COUNT(id) as num
FROM tbl_demo3
GROUP BY color
 
ส่วนสุดท้าย คือการนับจำนวนทั้งหมด จะเห็นว่ารูปแบบ จะแตกต่างจาก 3 รูปแบบแรก  
เพราะจะไม่มีการจัดกลุ่ม 
 
SELECT
4 as section,
xxx as title,
COUNT(id) as num
FROM tbl_demo3
 
ส่วนของฟิลด์ที่จะใช้เป็น title ไม่มี ดังนั้นให้เราฟิกค่าเป็น string แทนดังนี้
 
SELECT
4 as section,
'total' as title,
COUNT(id) as num
FROM tbl_demo3
 
จากรูปแบบการ query ทั้ง 4 ข้างต้น เราจะได้ข้อมูลตารางใหม่ 4 ตาราง ที่มีชื่อฟิลด์เหมือนกัน
ดังนั้น เราสามารถนำคำสั่งทั้งหมด มาทำการ UNION แล้วเรียกใช้ผ่านการคิวรี่ครั้งเดียวได้ ด้วย
รูปแบบดังนี้
 
SELECT
1 as section,
province as title,
COUNT(id) as num
FROM tbl_demo3
GROUP BY province
UNION
SELECT
2 as section,
class as title,
COUNT(id) as num
FROM tbl_demo3
GROUP BY class
UNION
SELECT
3 as section,
color as title,
COUNT(id) as num
FROM tbl_demo3
GROUP BY color
UNION
SELECT
4 as section,
'total' as title,
COUNT(id) as num
FROM tbl_demo3
 
ผลลัพธ์ที่ได้
 
 
เราสามารถใช้ php จัดการกับข้อมูลต่อไป โดยสามารถกำหนดเป็น array 2 มิติ เพื่อแยกข้อมูล
เป็น section แล้วนำไปแสดง 


ninenik 30-10-2018
 ความคิดเห็นที่ 2
ขอบคุณครับ


giggstar 30-10-2018 18:31
 ความคิดเห็นที่ 3
อธิบายตรงนี้เพิ่มให้หน่อยครับ กำลังศึกษาและนำมา code ครับ มีตัวอย่างให้ดูไหมครับ


Paii Pakin 29-05-2020 15:47
1






เว็บไซต์ของเราให้บริการเนื้อหาบทความสำหรับนักพัฒนา โดยพึ่งพารายได้เล็กน้อยจากการแสดงโฆษณา โปรดสนับสนุนเว็บไซต์ของเราด้วยการปิดการใช้งานตัวปิดกั้นโฆษณา (Disable Ads Blocker) ขอบคุณครับ