14 กันยายน, 2557

[SQL] เรียงข้อมูลตามค่าที่รู้อยู่แล้วด้วย order by field

วันนี้ขออัพบล๊อกสั้นเก็บไว้กันลืมเอง


เรื่องมีอยู่ว่า ต้องการจะเขียน SQL สำหรับดึงข้อมูลตาม id ที่รู้อยู่แล้วชุดหนึ่งออกมา
ถ้าเรามีตัวแปร id พวกนั้นอยู่ก่อนแล้ว ก็จะเขียนได้ประมาณนี้
(เขียนด้วยภาษา php นะ)
$id = array(1, 2, 3, 10, 12);
$sql = '
    select *
    from Products
    where id in (' . implode(',', $id) . ')
';

โค้ดธรรมดามาก เอาไปรันก็จะได้ตัวแปร $sql ออกมาประมาณนี้
select *
from Products
where id in (1, 2, 3, 10, 12)
อ้าว! แล้วมันไม่ได้อะไรตรงไหน
ก็ผลที่รันออกมาหลังจากเอาไป execute แล้วมันได้ประมาณนี้น่ะสิ

|----|---------|
| id | name    |
|----|---------|
|  2 | pencil
  |
| 10 | books   |
|  3 | cup     |
|  1 | pen     |
| 12 | rubber  |

|----|---------|
เอ๊ะ ทำไมเลขมันไม่เรียงกันตามที่เราใส่ไปล่ะ?

เพราะว่าการสั่ง where มันไม่ได้เป็นคำสั่ง order by ไงล่ะ คือมันเช็กอย่างเดียวว่าตัวนี้เอามั้ย แต่ไม่เรียงให้นะ ลำดับข้อมูลจะออกมายังไงก็ตามที่ Database มันทำ index เอาไว้ให้ แต่ละครั้งอาจจะออกมาไม่เหมือนกันด้วย

ดังนั้น ถ้าเรารู้ว่า id ที่เราต้องการจะเรียงมีอะไรบ้าง (อาจจะไม่ตามลำดับ มากไปน้อย หรือ น้อยไปมาก ก็ได้นะ) เราก็จะใช้

order by field

เขียนเพิ่มลงไปแบบนี้
select *
from Products
where id in (1, 2, 3, 10, 12)

order by field(id, 1, 2, 3, 10, 12)
บอกให้เรียงตาม field ที่เรากำหนดเอง ช่องแรกจะใส่ "ชื่อฟิลด์" ลงไป ตามด้วยค่าที่ต้องการจะให้เรียง

พอสำแบบนี้ ค่าที่ Database เรียงออกมาให้ก็จะสวยงามตามลำดับแบบนี้แหละ
|----|---------|
| id | name    |
|----|---------|
|  1 | pen     |
|  2 | pencil
  |
|  3 | cup     |
| 10 | books   |
| 12 | rubber  |
|----|---------|

ไม่มีความคิดเห็น:

แสดงความคิดเห็น