2009-08-10 42 views
25

Giả sử tôi có 50 hàng trong bảng MySQL. Tôi muốn chọn mười đầu tiên (LIMIT 10), nhưng sau đó tôi muốn có thể chọn 10 trang tiếp theo trên một trang khác.Làm cách nào để chọn các hàng trong MySQL bắt đầu từ một số hàng nhất định?

Vậy làm cách nào để bắt đầu lựa chọn của tôi, sau hàng 10?

truy vấn Cập nhật:

mysql_query(" 
    SELECT * FROM `picdb` 
    WHERE `username` = '$username' 
    ORDER BY `picid` DESC 
    LIMIT '$start','$count' 
") 
+1

Hãy thử mysql_query ("SELECT * FROM' picdb' WHERE 'username' = '$ username' ORDER BY' picid' DESC LIMIT $ bắt đầu, $ count ") – Rufinus

+1

Chỉnh sửa lại, bạn sẽ nhận được phản hồi lỗi thiết lập đến mức nó sẽ cho bạn biết có gì sai với SQL của bạn. Bạn sẽ thấy bạn có một lỗi cú pháp vì mệnh đề 'LIMIT' của bạn là trước mệnh đề' ORDER BY'. – chaos

+0

cảm ơn các bạn, hãy làm việc tốt ngay bây giờ. – mrpatg

Trả lời

52

tôi khuyên bạn nên làm việc bằng cách lấy trang đầu tiên sử dụng:

LIMIT 0, 10 

sau đó cho trang thứ hai

LIMIT 10, 10 

sau đó

LIMIT 20, 10 

cho trang thứ ba, v.v.

+0

xin lỗi nhưng tôi cứ tự hỏi nó hoạt động như thế nào? nó làm việc cho tôi nhưng tôi không thể có được nó, nó có nghĩa là để lấy staring từ 21 với tối đa 10 hàng? – engma

+0

Tôi đã thực hiện một số tìm kiếm trong một thời gian, và số bắt đầu phụ thuộc vào động cơ, khi tôi thử nghiệm với innodb nó bắt đầu với 0 không 1, vì vậy bạn nên kiểm tra các tùy chọn động cơ của bạn. – engma

+1

@ Developer106: Trên thực tế, tôi không thể sao chép chỉ mục bắt đầu bằng 1 trong mọi trường hợp, vì vậy tôi không biết phiên bản trước của câu trả lời này đã xảy ra như thế nào. – chaos

25
LIMIT 10 

LIMIT 10 OFFSET 10 

Từ MySQL 5.1 docs on SELECT syntax:

Đối với khả năng tương thích với PostgreSQL, MySQL cũng hỗ trợ LIMIT ROW_COUNT OFFSET cú pháp bù đắp.

+2

Điều đó có hợp lệ không? Tôi chưa bao giờ thấy điều đó. – mpen

+7

Tôi không chắc OFFSET phổ biến như thế nào; nhưng nó rõ ràng hơn một chút vì bạn không phải nhớ số nào là giới hạn và đó là giá trị bù trừ. –

+3

+1 bởi vì tôi không biết họ sẽ đưa nó vào. – chaos

1

Câu hỏi này cũ nhưng tôi chỉ muốn thêm mã không mã hóa, sự hỗn loạn của câu trả lời có nghĩa là bạn sẽ phải mã hóa các tập lệnh của mình (Chọn câu lệnh). bạn có thể đạt được kết quả tương tự bằng cách lấy tên tệp và sau đó chọn dữ liệu từ cơ sở dữ liệu dựa trên trang hiện tại, mà không cần mã hóa cứng câu lệnh chọn của bạn. đầu tiên được trang hiện

$page = basename($_SERVER['SCRIPT_FILENAME']); 
$page_counter = rtrim($page, ".php"); 
//setting your limit 
$start = 0; 
$limit = 10; 
//if current page is not index.php then $start = ($limit * page_counter); 
// e.g if current page is 1.php then $start = ($limit * 1) = 10 
//if current page is 2.php then $start = ($limit * 2) = 20 
if ($page !== 'index.php') { 

$start = ($limit * $page_counter); 
} 
//getting row count 
$ROW_COUNT = $db->query('SELECT * from tableName')->rowCount(); 

//getting number of rows left in the table 
$rows_left = ("SELECT * FROM tableName limit ?,?"); 
$rows_left = $db->prepare($rows_left); 
$rows_left->execute(array($start,$ROW_COUNT)); 
$rows = $rows_left->fetchAll(PDO::FETCH_ASSOC); 

$number_rows = 0; 
foreach ($rows as $r) { 
$number_rows = $number_rows + 1; 
} 
//if number of rows left in the table is less than 10 then $limit = the number of rows left 
if ($number_rows < 10) { 
$limit = $number_rows; 
} 

//getting all rows 
      $getRows = "SELECT * FROM tableName limit ?,?"; 
      $getRows = $db->prepare($getRows); 
      $getRows->execute(array($start , $limit)); 
      $getRows = $getRows->fetchAll(PDO::FETCH_ASSOC); 
0
select * from 'table_name' 
ORDER BY 'column_id 'DESC 
LIMIT 0,10; 

select * from 'table_name' 
ORDER BY 'column_id' DESC 
LIMIT 10,10; 

select * from 'table_name' 
ORDER BY 'column_id' DESC 
LIMIT 20,10; 

và tiếp tục cho đến khi những con số mà bạn muốn.

+0

Chào mừng bạn đến stackoverflow! Đây là một câu hỏi lưu lượng truy cập khá cũ, cao, câu trả lời của bạn có bổ sung thêm một câu trả lời nào khác không?Nói chung sẽ tốt hơn nếu bạn có thể chỉnh sửa các câu trả lời hiện có, được chấp nhận để phản ánh bất kỳ thay đổi cần thiết nào chứ không phải là câu trả lời hoàn toàn mới, vì hầu hết người dùng sẽ không cuộn xuống dưới cùng (nơi câu trả lời của bạn sẽ xuất hiện). – zack6849

Các vấn đề liên quan