begin selection with second row of data - mysql

I need to begin my selection starting with the second row of data. This query works fine
SELECT Sum(ttimediff) as 'TOTAL IDLE TIME (sec)' FROM temp where ttimediff>#3;
I just need it start with the second row, and read all rows after that.
I have tried FROM temp ORDER BY asc LIMIT 2 where ttimediff>#3; but I believe the limit statement is stopping the selection at 2. I get a syntax error

You can do this with Limit but you need to have 2 Arguments like this :
SELECT * FROM table_name LIMIT 1, 5000
This will skip 1 element and check until 5000

Related

get records from table starting from row 5 onwards

I have a mysql Database and I want to get the records starting from row 5 onwards. This is what i am sing right now
SELECT * FROM categories WHERE status = 1
limit 5 18446744073709551615 ORDER BY sortOrder ASC
But it is throwing me an error
Error Executing Database Query.
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '18446744073709551615
ORDER BY
sortOrder ' at line 6
Also i am not sure at this point if this is the correct way of doing it or not
Thanks
You require OFFSET
Example:
SELECT something FROM table LIMIT $limit OFFSET $offset;
//or alternatively
SELECT something FROM table LIMIT $offset,$limit;
Regarding your error:
Remove the number - what is it for in the first place?
Your statement should be:
SELECT * FROM categories WHERE status = 1
OFFSET 5 ORDER BY sortOrder ASC
You missed a comma , in your sql query.. just change it to the following:
SELECT * FROM categories WHERE status = 1
limit 5, 18446744073709551615 ORDER BY sortOrder ASC
↑
Explanation: LIMIT with two arguments (comma separated) will take first argument as OFFSET and second as the maximum number of rows to return.
Alternatively, if you just want to get all rows from a particular record.. you can use OFFSET keyword. The following will fetch rows starting from 5th row.
SELECT * FROM categories WHERE status = 1
OFFSET 5 ORDER BY sortOrder ASC
Perhaps You need to just Rearrange the sequence of Instruction.
Make Sure 'sortOrder' column exists in your Categories table.
The Following Query should work,
Select * from Categories Where status =1
ORDER BY sortOrder ASC
Limit 4, 999980090909
If you want to get the rows starting from 5 , then your Limit value should start from 4 and the second value can be some larger number.
Hope this helps you!

SQL Async Multiple Queries Combine Results -- Maximum Results (Top XYZ)

I have a search function set up, where I run multiple queries simultaneously. The top 1000 results of each query are written to a table. (These run async--I am just leaving out the code that I am using to do that)
Insert into Results
Select Top 1000 Text from A where Contains(Text,'"searchString"')
Insert into Results
Select Top 1000 Text from B where Contains(Text,'"searchString"')
Insert into Results
Select Top 1000 Text from C where Contains(Text,'"searchString"')
Then, I select the top 1000 results from that table.
Select Top 1000 * from Results
Would there be a good way to efficiently check, at any point earlier in the process, if there are already 1000 results, and, if there are, cancelling the other queries and selecting the 1000 results ASAP.
The following will likely give you a plan that achieves your desired result of not processing any rows after the 1,000th one has been found.
WITH CTE
AS (SELECT Text
FROM A
WHERE CONTAINS(Text, '"searchString"')
UNION ALL
SELECT Text
FROM B
WHERE CONTAINS(Text, '"searchString"')
UNION ALL
SELECT Text
FROM C
WHERE CONTAINS(Text, '"searchString"'))
INSERT INTO Results
SELECT TOP 1000 Text
FROM CTE
If you setup your result table with an identity column you can achieve your goal using this query (let 'counter' be that column. don't forget to put an index on it)
declare #remaining int
select #remaining = 1000 - (max(counter) - min(counter) + 1) from result
if #result>0
insert into Result (Text) select top (#remaining) Text from MyTable
Also, if you have a list of table names, you can use a while loop and exit if #result is 0.
The following SQL limits the number of rows to 4 from any subsequent query
SET ROWCOUNT 4
SET #Rows = ##ROWCOUNT
Get the number of rows form the preceeding select
so something like
SELECT TOP etc...
SET #Rows = ##ROWCOUNT
SET ROWCOUNT 1000 - #Rows
Will probably error if #row goes below zero
but you an trap this with IF and goto PROC_LABLE
insert into #tt2
SELECT TOP 1000 [sID]
FROM [docSVsys]
where (select count(*) from #tt2) < 1000
But I would still use .NET and TPL.
This will still process all tables but it should process 0 rows once it gets to 1000

Use of Limit in mysql

First query is giving fine results but question is about 2nd
When I have given limit 2,2. How two rows can be selected? this is the weied beahaviour query
SELECT Ordinal_Position, Column_Name FROM information_schema.columns WHERE
table_schema = 'accounts' AND table_name = 'chequeout' LIMIT 2 , 2
What is wrong with 2nd query or its sum bug? What could be the solution?
Expected result of second query is a single row with values 2 and Amount
Limit 2, 2 means start at record 2 (the third 0,1,2) and display 2 rows
What you seem to want to do is :
WHERE Ordinal_Position = 2
You're probably a little confused about how to use LIMIT:
LIMIT <offset>,<limit>
<offset> means starting row index and <limit> tells how much rows.

MySQL - How to query for one value but default to another?

I asked the question about multiple rows in a previous thread, but now I need to know about a single row. This is an example query:
SELECT * FROM table1 WHERE this = 5 LIMIT 1
But if there is no rows found then I would it to then find the record with a different value:
SELECT * FROM table1 WHERE this = 1 LIMIT 1
So what I want is, find a row with this having the value of 5, if not found then default to finding a row with a value of 1. How do I do that in a single query? Would an OR statement work like so?
SELECT * FROM table1 WHERE this = 5 OR this = 1 LIMIT 1
Would the order of the OR statement try to find any row with the value of 5, if found then it will stop and return the row? IF not found then look for 1 and then return that row? If not then how do I do this with a single query where it searches for one value, if not found defaults to find another value?
I was thinking this query:
SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this ASC LIMIT 1
However this query would always return the value with 1 if both values were found right? So I tried this:
SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1
But this would always return the value of 5 if both rows were found correct?
Your question appears to prioritize the search for 5 and only if not found then search for 1. Hence your second solution fits the requirement fine. It will return the value of 5 irrespective of if 5 is only found or both 5 and 1 exist.
the 2nd option
SELECT * FROM table1 WHERE this IN(5,1) ORDER BY this DESC LIMIT 1
Try this
SELECT *
FROM table1 tab
WHERE tab.this = IF((SELECT COUNT(*)
FROM table1
WHERE this = 5) > 0, 5, 1)
The query inside the IF is checking for the count.
I am not sure about the performance but I think this solves your issue.

UPDATE with ORDER BY and LIMIT not working in MYSQL

I am new to MYSQL, and unable to resolve or even with so many answers on this forum, unable to identiy the error in this statement. I am using MYSQL database.
I have 2 tables: Ratemaster and rates, in which a customer can have 1 product with different rates.
Because of this, there is a duplication of customer and product fields, only the rate field changes.
Now Table Ratemaster has all the fields : id, Customer code, Product, Rate, user
whereas Table Rates has only: id, cust code, Rate, user.
- user field is for checking session_user.
Now Table Ratemaster has 3 records with all field values being same except Rate field empty.
Table Rates has different rates.
I want to have all rates to be updated in Ratemaster from Rates table. I am unable to do this with UPDATE and LIMIT mysql command, it is giving error as:
Incorrect usage of UPDATE and LIMIT
UPDATE Ratemaster, Rates
SET Ratemaster.Rate=Rates.Rate
WHERE Ratemaster.user=Rates.user
LIMIT 1
Usually you can use LIMIT and ORDER in your UPDATE statements, but in your case not, as written in the MySQL Documentation 12.2.10. UPDATE Syntax:
For the multiple-table syntax, UPDATE updates rows in each table named
in table_references that satisfy the conditions. In this case, ORDER
BY and LIMIT cannot be used.
Try the following:
UPDATE Ratemaster
SET Ratemaster.Rate =
(
SELECT Rates.Rate
FROM Rates
WHERE Ratemaster.user = Rates.user
ORDER BY Rates.id
LIMIT 1
)
Salam
You can use this method and work properly !
UPDATE Ratemaster, Rates
SET Ratemaster.Rate=Rates.Rate
WHERE Ratemaster.user=Rates.user
ORDER BY Rates.id
LIMIT 1
Work It 100%
UPDATE table SET Sing='p' ORDER BY sr_no LIMIT 10;
Read article about
How to use ORDER BY and LIMIT on multi-table updates in MySQL
For the multiple-table syntax, UPDATE updates rows in each table named
in table_references that satisfy the conditions. In this case, ORDER
BY and LIMIT cannot be used.
The problem is that LIMIT is only to be used with SELECT statements, as it limits the number of rows returned by the query.
From: http://dev.mysql.com/doc/refman/5.5/en/select.html
The LIMIT clause can be used to constrain the number of rows returned by
the SELECT statement. LIMIT takes one or two numeric arguments, which
must both be nonnegative integer constants, with these exceptions:
Within prepared statements, LIMIT parameters can be specified using ? placeholder markers.
Within stored programs, LIMIT parameters can be specified using integer-valued routine parameters or local variables as of MySQL 5.5.6.
With two arguments, the first argument specifies the offset of the
first row to return, and the second specifies the maximum number of
rows to return. The offset of the initial row is 0 (not 1):
SELECT * FROM tbl LIMIT 5,10; # Retrieve rows 6-15
To retrieve all rows from a certain offset up to the end of the result
set, you can use some large number for the second parameter. This
statement retrieves all rows from the 96th row to the last:
SELECT * FROM tbl LIMIT 95,18446744073709551615;
With one argument, the value specifies the number of rows to return
from the beginning of the result set:
SELECT * FROM tbl LIMIT 5; # Retrieve first 5 rows
In other words, LIMIT row_count is equivalent to LIMIT 0, row_count.
For prepared statements, you can use placeholders. The following
statements will return one row from the tbl table:
SET #a=1; PREPARE STMT FROM 'SELECT * FROM tbl LIMIT ?'; EXECUTE STMT
USING #a;
The following statements will return the second to sixth row from the
tbl table:
SET #skip=1; SET #numrows=5; PREPARE STMT FROM 'SELECT * FROM tbl
LIMIT ?, ?'; EXECUTE STMT USING #skip, #numrows;
For compatibility with PostgreSQL, MySQL also supports the LIMIT
row_count OFFSET offset syntax.
If LIMIT occurs within a subquery and also is applied in the outer
query, the outermost LIMIT takes precedence. For example, the
following statement produces two rows, not one:
(SELECT ... LIMIT 1) LIMIT 2;