ขอแนวคิดของการออกแบบ DB เก็บข้อมูล โดยแบ่งตามเดือนและปี
เก็บลง 1 table ครับ และใช้วันที่ในการ Query ออกมาก็น่าจะได้แล้วน่ะครับ
Date :
2010-01-19 08:13:08
By :
webmaster
ถ้าจะกำหนดให้ User ให้คะแนนในแบบประเมินได้เพียงเดือนละครั้ง จะใช้วิธีใหนดีค่ะ
ขอบคุณค่ะ
Date :
2010-01-22 08:38:39
By :
Avrill
ช่วยอธิบายหน่อยจิ มือใหม่ งงจร้า ขอบคุณนะค่ะ
คล้ายๆ ตรงให้คะแนน ไทยครีเอต กดได้วันละครั้ง แต่เปลี่ยนเป็นเดือนละครั้งแทน
Date :
2010-01-22 09:01:50
By :
Avrill
ผมไม่รู้พี่วินจะทำเหมือนกันเปล่าน่ะเพราะทำได้หลายแนวทาง
แก้ครับผิดนิดหน่อย
update table_name set field_point=field_point+ 'x' ,field_date=now() where field_id='x' and TIMESTAMPDIFF(MONTH,field_date,now()) ! =0
update table_name // ทำการอัพเดทที่ตารางนี้
set field_point =field_point+'x' // อัพเดทแต้มด้วยการเพิ่มคะแนน x เข้าไป
,field_date=now() // ทุกครั้งที่อัพเดทก็บันทึกเวลาที่อัพเดทใหม่ลงไปด้วยเพื่อเอาไปเปรียบเทียบหาเดือน
where field_id='x' // เงื่อนไขอัพเดทมีอยู่ว่า ต้องเป็น field_id ที่ x
and TIMESTAMPDIFF(MONTH,field_date,now()) !=0 //และเงื่อนไขจะต้องไม่ใช่เดือนนี้
TIMESTAMPDIFF(MONTH,field_date,now())
TIMESTAMPDIFF() // เป็นฟังก์ชันการเปรียบเทียบเวลา จะส่งค่ารีเทรินมาเป็นผลต่างครับ
MONTH เลือกประเภทที่จะเปรียบเทียบที่นี้คือเดือน ผลต่างที่รีเทรินมาจะเป็นเดือนครับ
field_date เป้าหมายที่จะเปรียบเทียบ
ืnow() สิ่งที่จะไปเปรียบเทียบ
ถ้าพูดเป็นภาษาคำพูด
Code
นำค่าเวลาปัจจุปันมาลบกับเวลาที่บันทึกไว้ จะได้เท่ากับผลต่างหน่วยเป็นเดือน
ถ้า field_date คือเดือนนี้ แล้วใช้ now() เปรียบเทียบ ผลต่างที่ได้จะเป็น 0
ถ้า field_date คือสองเดือนก่อนหน้า แล้วใช้ now() เปรียบเทียบ ผลต่างที่ได้จะเป็น 2
ก็แสดงว่า ถ้าเมื่อเดือนที่แล้วเราประเมินไปและได้เก็บค่าเวลาเดือนที่แล้วไว้ใน field_date
แล้ว เดือนนี้ทำการประเมินอีกจะสามารถเก็บค่าประเมินได้
แต่ถ้า เดือนนี้ทำการประเมินไปแล้ว และเดือนนี้จะทำการประเมินอีก TIMESTAMPDIFF(MONTH,field_date,now()) จะได้ผลต่างเท่ากับ 0 ทำให้ไม่สามารถ update ได้ครับ *.*
Date :
2010-01-22 09:54:09
By :
xbeginner01
พี่ xbeginner01 แล้วถ้าหากเราเปลี่ยนจาก TIMESTAMPDIFF(MONTH,field_date,now()) ตรงนี้
ให้ now() มาเป็นอีกฟิลที่เราเก็บไว้มาเปรียบเทียบ field_date และเปลี่ยน Mounth เป้นวันได้ป่ะคับ
และเปลี่ยนเป็นการ SELECT ข้อมูลออกมาแทน
ไม่ทราบว่าเขียนจากคำสั่ง SQL เลยได้ป่ะพี่
Date :
2010-01-22 10:01:34
By :
ความรู้เท่าหางอึ่ง
ได้ครับ
select TIMESTAMPDIFF(DAY,field_date1,field_date2) from tbl_name
หมายความว่า field_date2-field_date1 ผลต่างที่ได้หน่วยจะเป็นวัน เช่น
TIMESTAMPDIFF(DAY,'2009-01-01','2010-01-01') ผลลัพธ์ที่ได้ 365 (เท่ากับ 1 ปี)
Date :
2010-01-22 10:13:33
By :
xbeginner01
อ่อ ขอบคุณครับ
แล้ว
field_date1 และ field_date1 ต้องเป็นชนิด datetime ใช่ไหมครับถึงจะทำเช่นนี้ได้
ถ้าหากข้างในเก็บเป็น text หรือ varchar ก้อต้อง เลือกมาแปลงด้วย ฟังชั่นของ php ขข้างนอกอีกทีใช่ป่ะคับ
Date :
2010-01-22 10:39:08
By :
ความรู้เท่าหางอึ่ง
varchar ก็น่าจะได้นะ แต่ต้องเรียงลำดับวันให้ถูกด้วย
ลำดับเวลาทั่วๆไป (แบบอื่นไม่แน่ใจได้เปล่า)
YYYY-mm-dd HH:ii:ss
หรือจะแค่
YYYY-mm-dd
ก็ได้ครับ ชม นาที วินาที ไม่ต้องใส่ก็ได้ เราเปรียบเทียบแค่หน่วยเป็นวันอยู่แล้ว
Date :
2010-01-22 10:46:22
By :
xbeginner01
ขอบคุณคับ
Date :
2010-01-22 11:02:30
By :
ความรู้เท่าหางอึ่ง
แบบไม่ต้องโหลดหน้าใหม่ เหมือนไทยครีเอตทำไงค่ะ
กดแล้วมี Alert เตือน
Date :
2010-02-11 17:10:20
By :
Avrill
ไม่แน่ใจพี่วินทำเหมือนกันเปล่าน่ะ
ผมให้คะแนนโหวตโดยสร้าง ตารางเก็บข้อมูลโหวตไว้ มีฟิลด์ vote_id,user_id,point,date
การโหวตแต่ละครั้งผมก็เอาเวลาโหวตล่าสุดไปเทียบกับตารางโหวต ถ้ายังไม่พ้นวันก็ไม่ให้โหวตและไม่เก็บข้อมูลลงไปครับ
Date :
2010-02-11 18:35:45
By :
xbeginner01
สงสัยเราจะบอกผิดไปค่ะ
แบบของคุณ xbeginner01 คือการ update บวกคะแนน ไปเรื่อยๆ ใช่ไหมค่ะ
แต่ที่เราจะทำคือ แบบฟอร์มประเมินค่ะ มีการเก็บข้อมูล เก็บคะแนน ของพนักงาน แล้วเอาคะแนนมาบวกกัน
คำนวณเป็นเปอร์เซ็นต์ เพื่อ พิจารณาโบนัสประจำปี
จะ insert ข้อมูลได้เพียงเดือนละครั้งค่ะ เก็บข้อมูลเป็นรายเดือน
ก็เลยจะเช็คว่า ให้ insert ข้อมูลได้ 1 ครั้งต่อเดือน ไม่แน่ใจว่าต้องเซ็คปีด้วยไหม
ช่วยแนะนำด้วยค่ะ ขอบคุณค่ะ
Date :
2010-02-12 11:49:12
By :
Avrill
อืมมมมม... ในส่วนของการทำ Database หลายๆท่านได้ช่วยไปพอสมควรแล้ว ..
.. ผมขอช่วยในส่วนของกำลังใจก็แล้วกันนะครับ
Date :
2010-02-12 11:57:51
By :
JavaScrap
Load balance : Server 04