เพื่อเลือกแถวสลับกัน (ทุก 2 แถว) และแสดงผลเรียงลำดับจากมากไปน้อย ใช้ฟังก์ชัน MOD() ในเงื่อนไข WHERE ร่วมกับ ORDER BY DESC
รูปแบบคำสั่ง
select *from yourTableName where mod(yourColumnName,2)=1 order by yourColumnName DESC;
สร้างตารางตัวอย่าง
mysql> create table DemoTable (
UniqueId int NOT NULL AUTO_INCREMENT PRIMARY KEY,
ClientName varchar(40),
ClientAge int );
Query OK, 0 rows affected (1.02 sec)
เพิ่มข้อมูลตัวอย่าง
mysql> insert into DemoTable(ClientName,ClientAge) values('Chris',34); Query OK, 1 row affected (0.47 sec)
mysql> insert into DemoTable(ClientName,ClientAge) values('Tom',45); Query OK, 1 row affected (0.19 sec)
mysql> insert into DemoTable(ClientName,ClientAge) values('Sam',36); Query OK, 1 row affected (0.16 sec)
mysql> insert into DemoTable(ClientName,ClientAge) values('Carol',42); Query OK, 1 row affected (0.25 sec)
mysql> insert into DemoTable(ClientName,ClientAge) values('David',38); Query OK, 1 row affected (0.12 sec)
แสดงข้อมูลทั้งหมด
mysql> select *from DemoTable;
+----------+------------+-----------+ | UniqueId | ClientName | ClientAge | +----------+------------+-----------+ | 1 | Chris | 34 | | 2 | Tom | 45 | | 3 | Sam | 36 | | 4 | Carol | 42 | | 5 | David | 38 | +----------+------------+-----------+ 5 rows in set (0.00 sec)
คิวรี่เลือกแถวสลับกัน (ID คี่) และเรียงจากมากไปน้อย
mysql> select *from DemoTable where mod(UniqueId,2)=1 order by UniqueId DESC;
ผลลัพธ์ (ID 5, 3, 1):
+----------+------------+-----------+ | UniqueId | ClientName | ClientAge | +----------+------------+-----------+ | 5 | David | 38 | | 3 | Sam | 36 | | 1 | Chris | 34 | +----------+------------+-----------+ 3 rows in set (0.00 sec)
คำอธิบาย
MOD(UniqueId, 2) = 1เลือกเฉพาะ ID ที่หาร 2 เหลือเศษ 1 (เลขคี่)- เปลี่ยนเป็น
= 0เพื่อเลือกเลขคู่แทน ORDER BY UniqueId DESCเรียงจากค่ามากไปน้อย- วิธีนี้ใช้ได้กับคอลัมน์ตัวเลขที่เรียงลำดับต่อเนื่อง
กรณีขั้นสูง: ใช้ ROW_NUMBER() (MySQL 8.0+)
สำหรับข้อมูลที่ ID ไม่ต่อเนื่อง ใช้ Window Function:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (ORDER BY UniqueId) as rn FROM DemoTable
) t WHERE rn % 2 = 1 ORDER BY UniqueId DESC;