SQL - เลือก 10 แถวแรกเท่านั้น?


124

ฉันจะเลือกเฉพาะผลลัพธ์ 10 รายการแรกของแบบสอบถามได้อย่างไร

ฉันต้องการแสดงเฉพาะผลลัพธ์ 10 รายการแรกจากข้อความค้นหาต่อไปนี้:

SELECT a.names,
         COUNT(b.post_title) AS num
    FROM wp_celebnames a
    JOIN wp_posts b ON INSTR(b.post_title, a.names) > 0
    WHERE b.post_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
GROUP BY a.names
ORDER BY num DESC

3
โปรดระบุฐานข้อมูล (และเวอร์ชัน)
Vikas Goel

2
ควรจะเป็นคำตอบใหม่stackoverflow.com/a/36476971/124486
Evan Carroll

ลอง TOP 10
Prisoner ZERO

คำตอบ:


173

ในเซิร์ฟเวอร์ SQL ให้ใช้:

select top 10 ...

เช่น

select top 100 * from myTable
select top 100 colA, colB from myTable

ใน MySQL ใช้:

select ... order by num desc limit 10


24

ใน MySQL:

SELECT * FROM `table` LIMIT 0, 10

1
ขีด จำกัด 0, 10 และขีด จำกัด 10 ต่างกันอย่างไร แล้วทำไมไม่ จำกัด 10, 20 ให้ฉัน 10 แถวระหว่างแถวที่ 10 ถึง 20? แก้ไข: โอ้ขีด จำกัด 10, 20 หมายถึงให้ฉัน 20 แถวหลังจากแถวที่ 10 ถ้าฉันต้องการแถวระหว่าง 10 ถึง 20 ฉันต้อง จำกัด 10, 10 ขอบคุณ!
AbdurRehman Khan

21

คำตอบ ANSI SQL FETCH FIRSTเป็น

SELECT a.names,
         COUNT(b.post_title) AS num
    FROM wp_celebnames a
    JOIN wp_posts b ON INSTR(b.post_title, a.names) > 0
    WHERE b.post_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
GROUP BY a.names
ORDER BY num DESC
FETCH FIRST 10 ROWS ONLY

หากคุณต้องการรวมความสัมพันธ์ให้ทำFETCH FIRST 10 ROWS WITH TIESแทน

หากต้องการข้ามจำนวนแถวที่ระบุให้ใช้OFFSETเช่น

...
ORDER BY num DESC
OFFSET 20
FETCH FIRST 10 ROWS ONLY

จะข้าม 20 แถวแรกจากนั้นดึงข้อมูล 10 แถว

รองรับโดย Oracle, PostgreSQL , MS SQL Server, Mimer SQL และ DB2 เป็นต้น


20

ใน SQL มาตรฐานคุณสามารถใช้:

... FETCH FIRST 10 ROWS ONLY

รองรับใน DB2, PostgreSQL และ Oracle 12.1 (และใหม่กว่า)


สำหรับ PostgreSQL ด้วย
ralf.w.

18

คำพยากรณ์

WHERE ROWNUM <= 10  and whatever_else ;

ROWNUMเป็นตัวแปรวิเศษที่มีหมายเลขลำดับของแต่ละแถว 1 .. n .


1
นี่เป็นสิ่งที่ไม่ถูกต้อง "rownum" จะดึงแถว 'n' บนสุดจากตาราง มันจะไม่กรองจากเงื่อนไข "what_else"!
Vikas Goel

stackoverflow.com/questions/874082/… โปรดติดตามคำตอบโดย stili สำหรับ Oracle related DB
Vikas Goel

2
SELECT *  
  FROM (SELECT ROW_NUMBER () OVER (ORDER BY user_id) user_row_no, a.* FROM temp_emp a)  
 WHERE user_row_no > 1 and user_row_no <11  

สิ่งนี้ใช้ได้ผลสำหรับฉันถ้าฉันทำได้ฉันมี dbscript ที่มีประโยชน์เพียงไม่กี่ชิ้นที่คุณสามารถดูได้

Dbscripts ที่มีประโยชน์


2

สิ่งที่คุณกำลังมองหาคือ LIMIT clause

SELECT a.names,
         COUNT(b.post_title) AS num
    FROM wp_celebnames a
    JOIN wp_posts b ON INSTR(b.post_title, a.names) > 0
    WHERE b.post_date > DATE_SUB(CURDATE(), INTERVAL 1 DAY)
GROUP BY a.names
ORDER BY num DESC
   LIMIT 10




โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.