A-AA+then

ต้องการให้กระทูล่าสุดที่มีการ update ขึ้นมาเป็นข้อแรกต้องทำยังไง

1,152
คือตอนนี้ผมสามารถทำให้กระทู้ล่าสุดขึ้นมาเป็นข้อแรกได้ แต่ไม่รู้จะทำยังไงให้กระทู้ล่าสุดที่มีคนมาตอบขึ้นมาเป็นข้อแรกด้วยอ่ะครับ

เพราะกระทู้ล่าสุดที่ขึ้นมาเราทำเพียง

$sql = "select * from webboard_question order by q_id desc";

มันก็ขึ้นมาแล้ว ถ้าต้องการให้กระทู้ล่สุดที่มีการตอบขึ้นมาด้วยต้องทำยังไงมั่งครับ

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

1. เขียน query ที่ซับซ้อน ซึ่งผมไม่รู้ว่าฐานข้อมูลที่ใช้ มีลักษณะอย่างไร เลยตอบไม่ได้
2. เพิ่มข้อมูลบางอย่างลงในตารางคำถาม
  2.1 เพิ่มฟิลด์ reply_date สำหรับเก็บข้อมูลคำตอบล่าสุดที่มีการตอบ
  2.2 เพิ่มฟิลด์ reply_id สำหรับเก็บข้อมูล id ของคำตอบล่าสุด เอาไว้อ้างอิง
  2.3 เวลามีการตอบคำถาม ให้อัปเดท 2 ฟิลด์นนี้ ด้วยข้อมูลจากตารางคำตอบล่าสุดที่เิพื่งตอบ

วิธีการ query เอามาจาก GCMS

SELECT *
        FROM webboard_q
        WHERE create_date>='$valid_date' OR reply_date>='$valid_date'
        ORDER BY create_date DESC

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

เนื่องจากโดยปกติ ผมจะเก็บวันที่ในรูป mktime ทำให้การคำนวณวันที่ค่อนข้างง่าย เช่น

$valid_date = $mmktime - (3600 * 24 * 3);

เลข 3 คือ จำนวนวัน 3 วันที่นับถอยหลังไปเพื่อติดกระทู้ใหม่

$mmktime คือ เวลาปัจจุบัน ในรูป mktime
1

ฐานข้อมูลผมแบ่งเป็น 2 ฐานครับคือคำถามกับคำตอบ

ฐานข้อมูลคำถาม  webboard_question

CREATE TABLE `webboard_question` (
  `q_id` int(11) NOT NULL auto_increment,
  `q_topic` varchar(100) NOT NULL,
  `q_detail` text NOT NULL,
  `q_name` varchar(50) NOT NULL,
  `q_date` varchar(30) NOT NULL,
  `q_ip` varchar(255) NOT NULL default '',
  `q_view` int(11) NOT NULL default '0',
  `q_reply` int(11) NOT NULL default '0',
  PRIMARY KEY  (`q_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=50 ;


ฐานข้อมูลคำตอบ webboard_answer

CREATE TABLE `webboard_answer` (
  `a_id` int(11) NOT NULL auto_increment,
  `a_detail` text NOT NULL,
  `a_name` varchar(50) NOT NULL,
  `a_date` varchar(30) NOT NULL,
  `a_ip` varchar(255) NOT NULL default '',
  `q_id` int(11) NOT NULL default '0',
  PRIMARY KEY  (`a_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ;

เป็นแบบนี้ครับ

2

อ่านะ เก็บข้อมูลแบบนี้ ก็ยากน่ะสิ

ข้อมูลวันที่ ควรเก็บเป็น ชนิด date เนื่องจาก จะสามารถนำมาคำนวณได้ หรือเก็บเป็นรูปตัวเลข mmktime แบบที่ผมใช้ก้ได้

ถ้าจะทำตามข้อมูลด้านบน คุณต้อง

1.query ข้อมูลจากตารางคำตอบ ตามวันที่ต้องการ (เก็บข้อมูลเป็น varchar จะคำนวณไงหว่า ?) โดยใช้คำสั่ง GROUP BY กับ q_id เพื่อให้ผลลัท์ มีแต่ q_id ที่ไม่ซ้ำกัน
2. นำ q_id ที่ได้ไป query กับตารางคำถาม เอเลือกข้อมูลคำถามออกมา
3. query เอา ข้อมูลใหม่ของตารางคำถามตามปกติ
4. เอาข้อมูล ที่ได้ตาม 2 และ 3 มารวมกันและตัด id ซ้ำทิ้ง
5. แสดงผล

ยุ่งมั้ย ?....

ผมแนะนำให้ปรับปรุงตารางตามที่ผมอธิบายไป จะง่ายกว่า ตัวอย่างเต็มๆ ของวิธีนี้ ให้ดูที่เว็บบอร์ดของ GCMS
3

ข้อมูลวันที่ผมเคยเก็บเป็น date แล้ว วันวนกลับ อย่าง 10 - 7- 2010 มันกลายเป็น 2010 - 7 - 10 เลยเปลี่ยนเป็น เก็บแบบ

varchar  แล้วประกาศตัวแปล  $q_date = date("j - n - Y"); แล้ว ใส่

<input name="q_date" type="hidden" id="q_date" value="<? echo "$q_date"; ?> "> เอาอ่ะครับ

แล้วถ้าเก็บข้อมูลแบบ date เราต้องทำยังไง มันถึงเรียง วัน เดือน ปี อ่ะครับ

4

อ้างจากคำตอบที่ #4ข้อมูลวันที่ผมเคยเก็บเป็น date แล้ว วันวนกลับ อย่าง 10 - 7- 2010 มันกลายเป็น 2010 - 7 - 10


นั่นแหละครับ ปัญหาของมัน ผมถึงได้ใช้ วันที่ในรูป mktime ครับ ซึ่งจะไม่มีปัญหาในการเซ็ตครับ

จริงๆแล้วคำสั่งจัดฟอร์แมตวันที่ก็มีอยู่ แต่ก็เจอหลาย Server ที่ไม่ยอมให้ใช้ครับ ผมเลยไม่ใช้

ลองศึกษาวันที่ในรูป mktime ดูนะครับ ผมว่ามัน เวอร์คสุด 

5
^