A-AA+then

ต้องการเปรียบเทียบผลของการรันคำสั่ง SELECT ใน mysql 2 คำสั่ง

3,866
 คือ ประมานว่า มีโจทย์เรื่อง sql อยู่ โดยสั่งให้ SELECT ข้อมูลในตาราง (รวมถึงการ join)

จะมีวิธีไหนตรวจสอบ ผลการ SELECT sql คำตอบที่ถูกต้อง กับ SQL คำตอบของนักเรียน บ้างคะ

ตอนนี้สามารถตรวจสอบ จำนวนฟิว จำนวนแถว ...เหลือการตรวจสอบข้อมูลค่ะ (อาจจะทดสอบแค่ ชื่อฟิวล์ และข้อมูลตัวแรกในแต่ละแถว) 

...... ตรวจสอบผลการรันนะคะ ไม่ใช่เชคจาก sql ที่ป้อน ....รบกวนหน่อยนะคะ

6 ความคิดเห็น

1

ผมเข้าใจว่าคือการให้เด็กทำข้อสอบเกี่ยวกับการใช้คำสั่ง SQL

โดยให้นักเรียนกรอกคำตอบเข้าไป แล้วให้ระบบประมวลผลว่า SQL ที่ใส่เข้าไปถูกต้องตามหลักการ

และให้ผลลัพธ์ที่ถูกต้องหรือไม่ใช่ไหมครับ.....

2

ใช่ค่ะ   ยังหาวิธีไม่ได้เรยย
3

ถ้าต้องการหาชื่อฟิลดิ์ ลองใช้ฟังก์ชั่นของ PHP คือ "ovrimos_field_name" รายละเอียดตามนี้ครับ
http://th.php.net/manual/en/function.ovrimos-field-name.php
แต่ผมตอนนี้ใช้ ADODB มันก็มีฟังก์ชั่นของมันเองเหมือนกัน......
ส่วนการหาข้อมูลตัวแรกในแต่ละแถวก็ใช้วิธีอ่านฟิลดิ์แรกออกมาพร้อมทั้งตัดเอาตัวอักษรตัวแรกออกมาไว้ในตัวแปรก็ได้ครับ แล้วก็เปรียบเทียบ

ถ้าจะเช็คแต่ชื่อฟิลดิ์อย่างเดียวก็อาจจะโดนลักไก่ได้ ถ้านักเรียนใช้ as แล้วตามด้วยชื่อฟิลดิ์คำตอบเลย แต่ถ้าต้องการตรวจสอบให้เหมือนกันเลยระหว่างคำตอบของโจทย์กับคำตอบของนักเรียน ก็น่าจะใช้ array เข้ามาช่วย โดยการ....

1. อ่านคำตอบของโจทย์เข้ามาเก็บไว้ใน array สองมิติ (รวมทั้งหัวคอลัมน์ด้วย)
ซึ่งจะได้หน้าตาเหมือนกับมุมมองของตาราง (เหมือน excel) ตรงนี้อาจจะคำนึงถึงวิธีการเรียงลำดับด้วย คือ โจทย์อาจจะต้องระบุให้นักเรียนจัดเรียงข้อมูล(แถว)ตามลำดับเช่น ไอดี เป็นต้น และต้องเรียงหัวตาราง(Field name) ตามลำดับเช่นกัน ซึ่งจะสะดวกต่อฟังก์ชั่นในการการตรวจเช็คมาก จุดประสงค์ที่ได้ก็คือจะทำให้นักเรียนรู้วิธีจัดเรียง Row และ Column ด้วย .... แต่ถ้าไม่สามารถทำได้ก็ต้องใช้ฟังก์ชั่นที่ยากขึ้น
2. อ่านผลลัพธ์ที่ได้ของนักเรียนเข้ามาเก็บไว้ใน array สองมิติ (รวมทั้งหัวคอลัมน์ด้วย) เช่นกัน
3. เปรียบเทียบ array ทั้งสองข้อว่าตรงกันหรือเปล่า

ถ้าคิดแค่ว่าเหมือนหรือไม่เหมือนก็ได้เลย แต่ถ้าจะประยุกต์ใช้กับ SQL ที่ซับซ้อนขึ้นก็อาจจะเพิ่มเติมในส่วนการคิดเปอร์เซ็นความเหมือน เช่น

1. การตรงกันของชื่อฟิลดิ์ (ก็คือเอาตำแหน่งแถวบนสุดในแต่ละตำแหน่งมาเปรียบเทียบกัน) คิดเป็นเปอร์เซ็นเท่าไร ตรงนี้จะได้ความถูกต้องของ SQL เพื่อเลือก Field จากฐานข้อมูล
2. เปรียบเทียบตำแหน่งที่ 1:0 จนถึง n:n ว่าตรงกันหรือไม่ โดยคิดเป็นเปอร์เซ็น เพราะบางครั้งเราอาจจะตรวจสอบฟังก์ชั่นของ Mysql ที่นักเรียนเรียกใช้ ว่าถูกต้องหรือไม่ด้วย ซึ่งมันจะผิดเฉพาะคอลัมน์ที่ใช้เท่านั้น เช่น สั่งให้นักเรียนคำนวนภาษีแล้วสร้างคอลัมน์ที่ชื่อ TAX ขึ้นมา

4

เข้าใจคำถามและ

ว่าแต่...หาอะไรยากๆมาทำเนาะ

แนวความคิดผมนะ ผมว่าใช้วิธีการตรวจคำตอบโดยการสร้าง View หรือ ตารางเสมิอนน่าจะง่ายกว่า

หลักการก็คือ สร้างตารางเสมือนจากคำตอบ แล้วเอาข้อมูลผลลัพท์ที่ได้ มาเปรียบเทียบกับ ข้อมูลจากตารางเสมือนที่ได้จากคำถาม(หรือคำตอบที่ถูกต้องนั่นแหละ)

วิธีการตรวจก็คือ
1.สร้างตารางของคำถาม โดยวิธี CREATE VIEW พร้อมทั้ง query ผลลัพท์ออกมา เอาผลลัพท์ใส่ array ไว้
2.เอาคำตอบที่กรอกมา ไปสร้าง VIEW และ query ผลลัพท์ใส่ array ไว้ หรือ เอาผลลัพท์ไปตรวจ กับ array ตามข้อ 1 ได้เลย

วิธีนี้มีข้อดีก็คือ ไม่ต้องตรวจ syntax เพราะถ้า syntax ผิด MySQL ก็คืน Error ออกมาเอง ตอนสร้าง View และ ผลัพท์ที่ได้ ก็เป็นผลลัพท์จริงๆ ที่ตรวจสอบได้ ว่าเหมือนกันทุกประการหรือไม และนอกจากนี้ วิธีนี้ ยังไม่มีผลเกี่ยวกับ การเขียน SQL ที่ไม่เหมือนกัน แต่ให้ผลลัพท์อย่างเดียวกันอีกด้วย (คำตอบบางอย่าง อาจมีวิธีเขียนที่ถุฏต้องได้หลายวิธี) เนื่องจากทั้งหมดจะตรวจจากผลลัพท์ที่ได้

ส่วนข้อเสียของมันก็มี บางอันก็ร้ายแรงซะด้วย เช่น
1.การสร้างโจทย์ จะทำได้ยาก หากต้องการให้การตรวจคำตอบกระทำได้ง่าย
2.มีความไม่ปลอดภัย เนื่องจากมีการ query จริงๆ อาจได้ผลลัพท์ที่ไม่พังประสงค์ได้ หาก query ที่กรอกมา มีวัตถุประสงค์ที่ไม่ดี เช่นการกรอก query ที่เกี่ยวข้องกับ รหัสผ่าน มาเนต้น (ปัญหานี้ เกิดกับทุกวิธีที่ต้องทำการ query จริงๆ)
3......อาจมีอีก นึกไม่ออก

การแก้ไขในข้อเสีย ก็พอมีนะครับ ผมจะให้พอเป็นแนวทาง
1.วิธีการสร้างโจทย์ อาจกำหนดให้ โจทย์เป็น query ที่ไม่ซับซ้อนก็ได้ และ อาจเก็บผลลัพท์ที่ถูกต้องในฐานข้อมูล และฟิลด์ที่ดูผลเลยก็ได้ ก็จะทำให้การตรวจคำตอบกระทำได้ง่ายขึ้น เช่น
คำสั่ง จงเขียนคำสั่ง เพื่อดูว่าข้อมูลที่ id 10 มีชื่อสมาชิกว่าอะไร
เราอาจเก็บคำตอบไว้เป็น username.goragod โดยที่ ข้อมูลแรกคือ ชื่อฟิลด์ที่ต้องการตรวจสอบ และ ข้อมูลที่ 2 เป็นค่าในข้อมูลผลลัพท์
2.เราอาจทำการจำกัดสิทธฺในการ query ของ user ก็ได้ครับ เช่น ฐานข้อมูลปกติของเรา ให้เราสามารถ query ได้ด้วย username และ รหัสผ่านของเราเท่านั้น ส่วน ฐานข้อมูลที่เกี่ยวกับข้อสอบ ให้ใช้ อีก username นึง ที่ไม่สามารถเข้าถึงฐานข้อมูลหลักได้
3.......

วิธีการทำอาจมีหลายแบบนะครับ ขึ้นกับมุมมองของแต่ละคน และ ความต้องการพื้นฐาน ให้เลือกวิธีที่ เข้าใจ สามารถมองภาพของมันออก และ ปฏิบัติได้ ครับ   
5

ขอบคุนมาก จริงๆ ค่ะ
6
^