MySQL offset infinite rows

前端 未结 9 2129
星月不相逢
星月不相逢 2020-11-22 16:25

I would like to construct a query that displays all the results in a table, but is offset by 5 from the start of the table. As far as I can tell, MySQL\'s LIMIT

相关标签:
9条回答
  • 2020-11-22 16:53

    Just today I was reading about the best way to get huge amounts of data (more than a million rows) from a mysql table. One way is, as suggested, using LIMIT x,y where x is the offset and y the last row you want returned. However, as I found out, it isn't the most efficient way to do so. If you have an autoincrement column, you can as easily use a SELECT statement with a WHERE clause saying from which record you'd like to start.

    For example, SELECT * FROM table_name WHERE id > x;

    It seems that mysql gets all results when you use LIMIT and then only shows you the records that fit in the offset: not the best for performance.

    Source: Answer to this question MySQL Forums. Just take note, the question is about 6 years old.

    0 讨论(0)
  • 2020-11-22 16:53

    I know that this is old but I didnt see a similar response so this is the solution I would use.

    First, I would execute a count query on the table to see how many records exist. This query is fast and normally the execution time is negligible. Something like:

    SELECT COUNT(*) FROM table_name;
    

    Then I would build my query using the result I got from count as my limit (since that is the maximum number of rows the table could possibly return). Something like:

    SELECT * FROM table_name LIMIT count_result OFFSET desired_offset;
    

    Or possibly something like:

    SELECT * FROM table_name LIMIT desired_offset, count_result;
    

    Of course, if necessary, you could subtract desired_offset from count_result to get an actual, accurate value to supply as the limit. Passing the "18446744073709551610" value just doesnt make sense if I can actually determine an appropriate limit to provide.

    0 讨论(0)
  • 2020-11-22 16:57

    Another approach would be to select an autoimcremented column and then filter it using HAVING.

    SET @a := 0; 
    select @a:=@a + 1 AS counter, table.* FROM table 
    HAVING counter > 4
    

    But I would probably stick with the high limit approach.

    0 讨论(0)
  • 2020-11-22 16:57
    WHERE .... AND id > <YOUROFFSET>
    

    id can be any autoincremented or unique numerical column you have...

    0 讨论(0)
  • 2020-11-22 17:04

    As you mentioned it LIMIT is required, so you need to use the biggest limit possible, which is 18446744073709551615 (maximum of unsigned BIGINT)

    SELECT * FROM somewhere LIMIT 18446744073709551610 OFFSET 5
    
    0 讨论(0)
  • 2020-11-22 17:04

    You can use a MySQL statement with LIMIT:

    START TRANSACTION;
    SET @my_offset = 5;
    SET @rows = (SELECT COUNT(*) FROM my_table);
    PREPARE statement FROM 'SELECT * FROM my_table LIMIT ? OFFSET ?';
    EXECUTE statement USING @rows, @my_offset;
    COMMIT;
    

    Tested in MySQL 5.5.44. Thus, we can avoid the insertion of the number 18446744073709551615.

    note: the transaction makes sure that the variable @rows is in agreement to the table considered in the execution of statement.

    0 讨论(0)
提交回复
热议问题