Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

การเลือกแถวสลับกันและเรียงลำดับจากมากไปน้อยใน SQL

เพื่อเลือกแถวสลับกัน (ทุก 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;