SQL LIMIT doesn't work as excepted - mysql

I always thought that LIMIT in a query selects only between numbers I set.
Suppose I have two columns to be selected with primary key - id. I have 90 rows.
SELECT name, lastname
FROM some_table
WHERE id = '123' LIMIT 0, 30
will select exactly 30 rows. Ok, but
SELECT name, lastname
FROM some_table
WHERE id = '123' LIMIT 30, 60
will select more than 30 rows. Well, I am doing this for AJAX paginator using PHP+mysql.
How can I do this right way?

limit is offset, rowcount. so it should be limit 30,30, not 30, 60, if you want 30 rows.

SELECT name, lastname FROM some_table WHERE id = '123' LIMIT 30, 30;
In simple language,
First 30 is the starting record number
Second 30 is the 30+30 which is 60th record.
This should work to get the records between 30 and 60.

When you specify two arguments to LIMIT, the second one is the maximum number of rows to return; so instead of LIMIT 30, 60, write LIMIT 30, 30. (See the explanation of LIMIT in ยง12.2.9 "SELECT Syntax" of the MySQL 5.6 Reference Manual.)

[LIMIT {[offset,] row_count | row_count OFFSET offset}]
second parameter is row count.

Read the documentation.
LIMIT 30 -- get 30 records
LIMIT 30, 60 -- skip 30 records and get next 60

According to the MySQL Documentation, the second number of the limit statement is the number of rows to be returned. If you want to get rows 31-60, then you need to specify
SELECT name, lastname FROM some_table WHERE id = '123' LIMIT 30, 30
You're asking MySQL to give you 60 rows start at offset 30.

Related

get MAX date using limit and offset

Is there a way to use limit offset and get the most recent (MAX) date from that group
My table: column_id, column_data, column_date
I've tried
SELECT max(column_date) FROM table_name limit 2000 offset 22000
I'm trying to get the most recent date in the 2000 rows returned using the offset. In other words, I'm looking for the last date modified in each group of 2000.
The table structure above has 100,000 rows. each query gets 2000 rows and I would like to retrieve the most recent date from the 2000 rows (using offset).
You must extract the whole group then find MAX() over it:
SELECT MAX(date_column)
FROM ( SELECT date_column
FROM source_table
ORDER BY some_expression /* compulsory! must provide rows uniqueness! */
LIMIT #rows_in_group OFFSET #group_offset ) AS subquery

SQL: Skip entries in an order without knowing total entry amount

The title is a bit confusing, but I'm wondering if there is a way to do a query like this:
SELECT * FROM table ORDER BY timestamp LIMIT 10
and then only take the ones after the 10th one (or none if there are less than or equal to 10 entries).
EDIT I guess another way to do this would be to order them by timestamp, descending, and then somehow limit to 0, (total-someNumber).
By specifying an OFFSET you can get the rows after a specified number. You combine this with limit.
In MySQL you achieve this with LIMIT [offset], limit.
Example - get 10 records after the oldest 10 records:
SELECT * FROM table ORDER BY timestamp LIMIT 10, 10; # Retrieve rows 11-20
Example - get 20 records after the newest 5 records:
SELECT * FROM table ORDER BY timestamp DESC LIMIT 5, 20; # Retrieve rows 6-25
If you want to get ALL rows after a certain number (eg. 10) then you pass an arbitrarily big number for the limit since it is required by the clause:
SELECT * FROM table ORDER BY timestamp LIMIT 10,18446744073709551615; # Retrieve rows 11-BIGINT
Note: 18446744073709551615 is the maximum of an unsigned BIGINT and is provided as the solution within the MySQL documentation.
See:
http://dev.mysql.com/doc/refman/5.5/en/select.html
I'd try something like this and then just add a where clause that skips the first n (n=10 in this case) rows.
i.e. using the linked example:
SELECT
*
FROM
(select #n := #n + 1 RowNumber, t.* from (select #n:=0) initvars, tbl t)
WHERE
RowNumber > 10

Sqlite Query select statement with sorted result respecting the OFFSET

I want to make a sqlite query in such a way that the result should be sorted which has a LIMIT and the OFFSET. But the OFFSET should work in synch a manner that it should discard the last records from the result.
SELECT * FROM TempTable WHERE CLASS = 1 ORDER BY Date ASC LIMIT 100 OFFSET 5;
The above query just ignores the first 5 records from the table and give the remaining records. But instead I want it to ignore the first 5 latest entries.
Note:- the first 5 latest entries means since I am sorting it by date it should IGNORE the latest record inserted in the table respecting the date.
Sort backwards, with OFFSET 5 and resort again:
SELECT * FROM (
SELECT * FROM TempTable WHERE CLASS = 1 ORDER BY Date DESC LIMIT 100 OFFSET 5
) ORDER BY Date ASC;

LIMIT does not work correctly

I have a problem when I need range from 10 to 20 (LIMIT 10, 20) it is returns everything from 1 to 20. I don't have any idea why it's works so.
Here is a query:
SELECT *
FROM table
LIMIT 10, 20
This table has 5 foreign keys, can it be a reason?
The limit syntax is LIMIT offset, rowcount. So you're asking for 20 rows, starting with the 10th. You probably want LIMIT 10, 10.
The limit command works as follows:
http://php.about.com/od/mysqlcommands/g/Limit_sql.htm
Your query should be:
SELECT *
FROM table
LIMIT 10,10
the first number indicates which record to start from, and the second indicates the amount of records to limit to.
You should be able to get what you want with limit 10 offset 10

limit after group of the result mysql

I have following the mysql query
SELECT * FROM tbltest WHERE DATE(posted_date) BETWEEN '20120414' AND '20130414' GROUP BY title ORDER BY mostviewed DESC LIMIT 30
Problem:
It return only 19 rows where row of duplicate title is eliminated but I want to return 30 rows after grouping. How can I do this?
LIMIT 30 - limits the result to a maximum of 30, but if you have less results according tot he filter you are using you get as much results as your query finds as long as less than 30.
If you wish more than 30 results you will need to change your filter, but only to get more results is non usual reason for changing a filter.