PHP: แบบสอบถาม MYSQL เรียงลำดับโดย

ตารางรูปภาพ ป้อนคำอธิบายรูปภาพที่นี่

สวัสดี ฉันมีตาราง comments และฉันต้องอ่านความคิดเห็นสามรายการสุดท้าย แต่ใช้วิธีอื่นดังนี้:

8
9
10

รหัสของฉันแสดงสิ่งนี้:

10
9
8

รหัส:

$sql_query = $connection->query("SELECT * FROM comments WHERE `post_id` = '38' ORDER BY `id` DESC LIMIT 3");

while ($ff = $sql_query->fetch_array(MYSQLI_ASSOC)) {
    echo $ff["text"]. "</br>";
}

ขอบคุณล่วงหน้า !


person GA ASD    schedule 26.12.2016    source แหล่งที่มา
comment
รวมคำสั่งของคุณในแบบสอบถามย่อยและเรียงลำดับจากน้อยไปหามากตาม ID ความคิดเห็น   -  person Terry    schedule 27.12.2016
comment
การเปลี่ยน 'DESC' เป็น 'ASC' จะทำให้ใช้งานได้ฉันเดา   -  person Expressingx    schedule 27.12.2016
comment
@Terry โปรดแสดงรหัสให้ฉันดู   -  person GA ASD    schedule 27.12.2016
comment
@Denisx noo ไม่ทำงาน   -  person GA ASD    schedule 27.12.2016
comment
ORDER BY text ASC หาก ASC ใช้ไม่ได้กับการเรียงลำดับภายใน text ให้ใช้ DESC   -  person Funk Forty Niner    schedule 27.12.2016
comment
@ Fred-ii- ด้วย LIMIT 3 ที่จะกลับมา 1, 2 et 3 หรือ 10, 9, 8 อีกครั้ง สิ่งนี้จำเป็นต้องมีการย้อนกลับอาร์เรย์ผลลัพธ์แบบสอบถามย่อยหรือด้วยตนเอง   -  person sidyll    schedule 27.12.2016
comment
@sidyll ฉันไม่เข้าใจว่าทำไม ASC ถึงใช้งานไม่ได้ตามที่แนะนำไว้ก่อนหน้านี้   -  person Funk Forty Niner    schedule 27.12.2016
comment
@GAASD คุณมีคำตอบด้านล่าง ดูคำตอบเหล่านั้น   -  person Funk Forty Niner    schedule 27.12.2016
comment
@ Fred-ii- order by text จะกลับมา (1,2,...,10) และด้วย limit ที่จะกลายเป็น (1,2,3) เมื่อ desc, (10,9,...1) กลายเป็น (10,9,8) เขาต้องการ (8,9,10) ประเด็นคือ limit นับประตูเยือนตั้งแต่ต้นเซต หากต้องการนับจากจุดสิ้นสุด จำเป็นต้องมีแบบสอบถามย่อย   -  person sidyll    schedule 27.12.2016
comment
@sidyll ขอบคุณสำหรับข้อมูล   -  person Funk Forty Niner    schedule 27.12.2016
comment
@Fred-ii- ขอบคุณ ทางเลือกอื่นเดียวที่ฉันนึกได้คือใช้ limit กับออฟเซ็ต เช่น order by text limit 3 offset 7 ก็ใช้ได้ สิ่งนี้ทำให้ฉันนึกถึงว่าเราสามารถสร้างหมายเลขออฟเซ็ตนั้นแบบไดนามิกด้วยแบบสอบถามย่อยได้หรือไม่ ฉันจะโพสต์คำถามถึงผู้เชี่ยวชาญ MySQL ที่นี่   -  person sidyll    schedule 27.12.2016
comment
@sidyll ตลกที่คุณควรพูดถึงเกี่ยวกับตัวเลือกออฟเซ็ตของ LIMIT ฉันได้เขียนความคิดเห็นถึง OP เกี่ยวกับเอฟเฟกต์นั้น แต่ลบทิ้งไปแล้ว ฉันควรจะทิ้งมันไว้ที่เดิม ฉันเดาว่าฉันสามารถขอให้ mod ยกเลิกการลบได้ แต่รู้สึกว่ามันไม่คุ้มค่า   -  person Funk Forty Niner    schedule 27.12.2016
comment
@ Fred-ii- น่าสนใจ ในกรณีนี้ ฉันคิดว่าวิธีที่ง่ายที่สุดคือการย้อนกลับชุดด้วย PHP แต่จริงๆ แล้วหากทราบจำนวนแถว การจำกัดด้วยออฟเซ็ต เป็นวิธีที่สะอาดมากในการดำเนินการ อย่างไรก็ตาม ฉันไม่รู้ว่าเป็นไปได้หรือไม่ที่จะนับแถวเป็นแบบสอบถามย่อยและใช้เป็นออฟเซ็ต ทั้งหมดในแบบสอบถามเดียว เพิ่งโพสต์คำถามเกี่ยวกับเรื่องนั้น   -  person sidyll    schedule 27.12.2016
comment
@sidyll ความคิดเห็นที่น่าสนใจเป็นสองเท่าที่นั่น ฉันจะคอยติดตามคำถามของคุณ ไชโย   -  person Funk Forty Niner    schedule 27.12.2016
comment
@GAASD บอกฉันได้ไหมว่าทำไมคุณถึงไปและลบคำถามที่เราช่วยเหลือคุณ stackoverflow.com/q/41371073/1415724 ฉันมีความคิดที่ดีที่จะแจ้งผู้ดูแลเพื่อยกเลิกการลบ เป็นที่ชัดเจนว่าเราได้แก้ไขปัญหานี้ให้กับคุณแล้ว นั่นไม่ถูกต้อง   -  person Funk Forty Niner    schedule 29.12.2016


คำตอบ (2)


คุณสามารถทำได้โดยใช้แบบสอบถามย่อยตามที่อธิบายไว้ในคำถามนี้ อย่างไรก็ตาม การใช้ array_reverse() ของ PHP อาจง่ายกว่า:

$rows = array_reverse($sql_query->fetch_all(MYSQLI_ASSOC));
foreach ($rows as $ff)
    echo $ff["text"]. "</br>";

ด้วยแบบสอบถามย่อย หากคุณต้องการ:

SELECT * FROM (
  SELECT * FROM comments
  WHERE `post_id` = '38'
  ORDER BY `id` DESC LIMIT 3
) t ORDER BY t.id

โดยพื้นฐานแล้ว สิ่งนี้จะสร้างตารางที่ได้รับซึ่งมีนามแฝงเป็น t พร้อมด้วยผลลัพธ์ของการสืบค้นเดิมของคุณ และจัดลำดับชุดผลลัพธ์ที่จำกัดนี้ใหม่

person sidyll    schedule 26.12.2016
comment
ฉันจะต้องจำเรื่องนี้ไว้ array_reverse() ฉันไม่เคยใช้มันมาก่อน แต่อาจจะในอนาคต - person Funk Forty Niner; 27.12.2016

แบบสอบถามต่อไปนี้จะให้ผลลัพธ์ที่ต้องการของคุณ

select * from (SELECT * FROM comments WHERE `post_id` = '38' ORDER BY `id` DESC LIMIT 3) temp order by id
person reza    schedule 26.12.2016