deleting variables by specifying id value with OFFSET - mysql

I want to delete specific variables based on 'id' value. but the code below is displaying syntax error near: OFFSET 1. I use a similar code where I use SELECT instead of DELETE and it works fine, What am doing wrong here? Thanks
DELETE FROM users WHERE name = '$name' ORDER BY id ASC LIMIT 1 OFFSET 1

The offset component in LIMIT is not available in MySQL DELETE statements but it is allowed in SELECT statements.
So what you can do to get around this fact, is you can actually join a subselect in a DELETE operation, which will then give you your desired results:
DELETE a FROM users a
INNER JOIN
(
SELECT id
FROM users
WHERE name = '$name'
ORDER BY id
LIMIT 1,1
) b ON a.id = b.id

You cannot specify offset in DELETE's LIMIT clause.
Simple use:
DELETE FROM users WHERE name = '$name' ORDER BY id ASC LIMIT 1;

Try
DELETE FROM users WHERE name = '$name' ORDER BY id ASC LIMIT 1,1

You can not have OFFSET in DELETE query.

Related

How to update a column for a range of row numbers?

I need to update the column "myColumn" in "myTable" for rows 5 to 10. I thought I can do the following but apparently it's giving me a syntax error:
UPDATE myTable SET myColumn = 'mamal' LIMIT 5,10;
Thanks
SQL tables represent unordered sets. If you have a primary key, you can use that for the ordering.
MySQL does allow limit, but not offset, so you could update the first five rows:
UPDATE myTable
SET myColumn = 'mamal'
ORDER BY id
LIMIT 5;
But not with an offset.
You could get around this with a JOIN:
UPDATE mytable t JOIN
(SELECT id
FROM mytable tt
ORDER BY id
LIMIT 5, 10
) tt
ON tt.id = t.id
SET myColumn = 'mamal';
You can select and update column value based on primarykey of your table.
if you want to change rows limit means you can change limit values.
in below code id Is nothing but Primay Key of your table
UPDATE myTable SET myColumn='mamal' WHERE id IN ( SELECT id FROM ( SELECT id FROM myTable where id ORDER BY id ASC LIMIT 5,5 ) tmp )
TRY by using subquery and join as below and please replace the join column in <column> with real one
UPDATE myTable mt
INNER JOIN (SELECT <column> FROm myTable LIMIT 5,10) t ON t.<column> = mt.<column>
SET mt.myColumn = 'mamal'
Try this:
update myTable
set myColumn = 'mamal'
where your_primary_key
in (select * from (select your_primary_key from myTable limit 5,5) as t);
MySQL does support offset in a limit clause, but only for SELECT. So the correct syntax is: LIMIT offset,row_count. In this case it should be limit 5,5, not limit 5,10. Check: Select Syntax.
You can also use LIMIT in UPDATE, but you can only specify the row_count in this case. Check: Update Syntax.
If you don't have a primary key, just use any unique key.
For why you need a select * from here, it's just a trick to bypass the error discribed here.
I ran into the same problem and saw the answers but after researching I found that you can use "BETWEEN" to UPDATE the Table.
UPDATE myTable
SET myColumn = "mamal"
WHERE id BETWEEN 5 AND 10;

Delete only one record in mysql database

what is the proper way to delete only one record from mysql data base.
this query used for select only one record.
SELECT * FROM Customers WHERE Country='Mexico' ORDER BY Country ASC LIMIT 1;
the above query run correctly .but when replace select to delete that not worked.
DELETE FROM Customers WHERE Country='Mexico' ORDER BY Country ASC LIMIT 1;
how I can fix it?
If you have an id column you can use a subselect. I have removed the order by since this will be the same like order by 'Mexico' asc which is pretty useless.
DELETE FROM Customers
WHERE (CustomerID IN ( SELECT CustomerID
FROM Customers where country = 'Mexico'
ORDER BY CustomerID ASC LIMIT 1 )) ;
I think below query will help you. You will need to have some key ID to differentiate.
DELETE FROM Customers
WHERE SOME_KEY_ID IN
(
SELECT SOME_RANDOM_ID FROM
(
SELECT B.SOME_KEY_ID SOME_RANDOM_ID FROM Customers as B
where Country = 'Mexico'
LIMIT 1
) as c
) ;
Note: The inner select SOME_RANDOM_ID is required, else sqlfiddle throws errors This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery': .
Reference FIDDLE Here

How to update the second to last entry in a MySQL table?

Does anyone have an idea how I can update, for example, a second to last entry?
For example, I have a Banned column in a Users table. I have to set Banned = 1 for the second to last account.
UPDATE Users SET Banned = '1' WHERE LIMIT 2,1
That's not working. Any ideas how I can get this to work?
Maybe it's possible to do one long query first. For example:
SELECT * FROM Users LIMIT 2,1
And then, using this query somehow update Banned column?
I assume there is an id auto-increment column in users table you can try this one
UPDATE Users SET Banned = '1' WHERE id =
(SELECT t.id FROM (SELECT id FROM Users ORDER BY id DESC LIMIT 1,1) t )
ORDER BY id DESC LIMIT 1,1 for second last account

Mysql Update wtih Join and limit

I need to update table using join and limit. I construct this query
UPDATE table1
JOIN table2 AS b
ON table1.id = b.id
SET
table1.username = b.post_username
WHERE b.post_username != ''
AND table1.username = ''
LIMIT 10
unfortunaetly I recive error:
Error Code: 1221
Incorrect usage of UPDATE and LIMIT
How can I solve this?
I'm afraid you can't do that:
If you read the documentation it says:
With no WHERE clause, all rows are updated. If the ORDER BY clause is
specified, the rows are updated in the order that is specified. The
LIMIT clause places a limit on the number of rows that can be updated.
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.
So you can't do that in your query.
hey just Delete LIMIT 10 from your code
You can use following query syntax:
update work_to_do as target
inner join (
select w. client, work_unit
from work_to_do as w
inner join eligible_client as e on e.client = w.client
where processor = 0
order by priority desc
limit 10
) as source on source.client = target.client
and source.work_unit = target.work_unit
set processor = #process_id;

You can't specify target table 'wp_mail_queue' for update in FROM clause

I get this error:
You can't specify target table 'wp_mail_queue' for update in FROM
clause
Because of this query:
DELETE FROM wp_mail_queue
WHERE message_id = (SELECT message_id FROM wp_mail_queue ORDER BY id LIMIT 0, 1)
ORDER BY wp_mail_queue.id
LIMIT 100
And I suppose it results from the subquery. Replace DELETE with SELECT * and it returns exactly the entries that I want to delete. What I need is a way to rewrite this so that I won't need to query wp_mail_queue in that subquery, or avoid the subquery entirely.
My thoughts went first to variables, if I could somehow assign the subquery to one and then use that?
Try:
DELETE FROM wp_mail_queue
WHERE message_id = (SELECT * FROM (SELECT message_id FROM wp_mail_queue ORDER BY id LIMIT 0, 1) queue_table)
ORDER BY wp_mail_queue.id
LIMIT 100