2009-08-10 8 views
25

Powiedzmy, że mam 50 wierszy w tabeli MySQL. Chcę wybrać pierwszą dziesiątkę (LIMIT 10), ale chcę mieć możliwość wybrania kolejnych 10 na innej stronie.Jak mogę wybrać wiersze w MySQL zaczynając od danego numeru wiersza?

Jak więc rozpocząć selekcję po wierszu 10?

Updated zapytania:

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

Spróbuj mysql_query ("SELECT * FROM' picdb' WHERE 'username' = '$ username' ORDER BY' picid' DESC LIMIT $ start, $ count") – Rufinus

+1

Re edycji, należy uzyskać swoją opinię błąd ustanowionego do tego stopnia, że ​​powie ci, co jest nie tak z twoim SQL. Przekonasz się, że masz błąd składni, ponieważ twoja klauzula "LIMIT" jest przed twoją klauzulą ​​"ORDER BY". – chaos

+0

dzięki chłopaki, działa dobrze teraz. – mrpatg

Odpowiedz

52

Polecam pracy poprzez uzyskanie pierwszej strony:

LIMIT 0, 10 

następnie na drugą stronę

LIMIT 10, 10 

następnie

LIMIT 20, 10 

dla trzeciej strony i tak dalej.

+0

Przykro mi to pytać, ale zastanawiałem się, jak to działa? to działa dla mnie, ale nie mogę tego zdobyć, czy to znaczy, że spoglądam z 21 z maksymalnie 10 rzędami? – engma

+0

od pewnego czasu robię kilka wyszukiwań, a numer początkowy zależy od silnika, kiedy testowałem z innodb, zaczynałem od 0, a nie 1, więc powinieneś sprawdzić swoje preferencje silnika. – engma

+1

@ Developer106: Właściwie nie mogę zreplikować indeksu zaczynając od 1 w żadnych okolicznościach, więc nie wiem, w jaki sposób wydarzyła się poprzednia wersja tej odpowiedzi. – chaos

25
LIMIT 10 

LIMIT 10 OFFSET 10 

Z MySQL 5.1 docs on SELECT syntax:

Dla zgodności z PostgreSQL, MySQL wspiera również ROW_COUNT OFFSET składni przesunięcie limitu.

+2

Czy to jest poprawne? Nigdy tego nie widziałem. – mpen

+7

Nie jestem pewien, jak szeroki jest OFFSET; ale jest trochę jaśniejsze, ponieważ nie musisz pamiętać, która liczba jest granicą, a która jest przesunięciem. –

+3

+1, ponieważ nie wiedziałem, że to wprowadzą. – chaos

1

To pytanie jest stare, ale chcę tylko dodać kod, który nie jest na sztywno, a podany chaos odpowiedzi oznacza, że ​​będziesz musiał skasować swoje skrypty (Instrukcja Select). możesz osiągnąć te same wyniki, pobierając nazwę pliku, a następnie wybierając dane z bazy danych na podstawie bieżącej strony, bez zakodowania instrukcji wyboru. najpierw uzyskać bieżącej strony

$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; 

i kontynuować aż żądane cyfry.

+0

Witamy w stackoverflow! Jest to dość stare pytanie o dużym natężeniu ruchu, czy twoja odpowiedź dodaje coś, czego jedna z innych, już ustalonych odpowiedzi nie ma?Ogólnie rzecz biorąc, lepiej jest edytować istniejące, zaakceptowane odpowiedzi, aby odzwierciedlić wszystkie niezbędne zmiany, a nie całą nową odpowiedź, ponieważ większość użytkowników nie przewinie tak daleko na dół (gdzie pojawi się twoja odpowiedź). – zack6849