Need help with simple MySQL query - mysql

I have a table with 4 values, meta_id, post_id, meta_key and meta_value, and I want to change all meta_values found as "yes" to "si" when the meta_key is stock_available... how do I do this?. I cannot even retrieve the rows at this point...I'm trying with something like this.
SELECT `meta_value` FROM `wp_postmeta` WHERE `meta_key` AND `meta_value` = 'yes'
Could I have some help?
EDIT: I had forgotten the meta_key...
SELECT * FROM `wp_postmeta` WHERE `meta_key` = 'stock_available' AND `meta_value` = yes'
So I retrieve these... btu how do I update them?

You need to use the SQL UPDATE statement:
UPDATE wp_postmeta SET meta_value = 'si' WHERE meta_value = 'yes' AND meta_key = 'stock_available'
Before you do that, run this SELECT to make sure that you are going to be updating the correct rows:
SELECT * FROM wp_postmeta WHERE meta_value = 'yes' AND meta_key = 'stock_available'

UPDATE wp_postmeta
SET meta_value = 'si'
WHERE meta_key = 'stock_available'
AND meta_value = 'yes';

Related

Woocommerce update stock quantity using MYSQL

I cannot find the meta key for the stock quantity in Woocommerce. What would be the best way to update the stock quantity in Woocommerce using MYSQL?
it's more secure you use the PHP functions. But if you want to update using sql, you can try this:
Checking stock
SELECT * FROM olenka.wp_postmeta where meta_key = '_stock';
Checking stock status:
SELECT post_id AS id, meta_value AS stockstatus FROM wp_postmeta WHERE meta_key = '_stock_status'
Set manage stock true:
UPDATE wp_postmeta SET meta_value = 'yes' WHERE meta_key = '_manage_stock'
Set the 'instock' flag:
UPDATE wp_postmeta set meta_value = 'instock' WHERE meta_key = '_stock_status' AND meta_value = 'outofstock'
Update the stock
UPDATE wp_postmeta SET meta_value = 99 WHERE meta_key = '_stock' AND meta_value IS NULL;
OR
UPDATE wp_postmeta SET meta_value = 99 WHERE meta_key = '_stock' AND meta_value > 0;

How to fix an SQL query which has a specifying table twice error

I have this query:
SELECT *
FROM `wp_postmeta`
WHERE `meta_key` = '_test'
AND `post_id` IN (SELECT post_id FROM `wp_postmeta`
where meta_value = 8023)
Returns the SQL error:
Table 'wp_postmeta' is specified twice, both as a target for 'UPDATE'
and as a separate source for data
I have read other answers and attempting to add a further SELECT * FROM ( ) around the sub query but didn't help.
I assume I need some form of AS in here but can't figure out the exact code.
Can you rewrite the query in the format that won't trigger the error?
The same for this similar query:
UPDATE wp_postmeta
SET meta_value = 5.55
WHERE meta_key = '_regular_price'
AND post_id IN (
SELECT post_id
FROM wp_postmeta
WHERE meta_value = 8023
)`
You can use alias for table name
(and as suggestion in your case you can also use join instead of in )
SELECT a.*
FROM `wp_postmeta` a
inner join `wp_postmeta` b on a.`post_id = b.post_id
where a.`meta_key` = '_test'
and b.meta_value = 8023
In update you could use a join with subselect for circumvent the limits due to update actions on the same table
UPDATE wp_postmeta a
inner join (
SELECT post_id
FROM wp_postmeta
WHERE meta_value = 8023
) t on a.`post_id = t.post_id and a.`meta_key` = '_test'
SET meta_value = 5.55
SELECT * FROM wp_postmeta as wp_out
WHERE wp_out.meta_key = '_test'
AND wp_out.post_id IN
( SELECT wp_in.post_id
FROM wp_postmeta as wp_in
where wp_in.meta_value = 8023)
Although this is not a good answer, but it is effective, ha ha..
SELECT *
FROM wp_postmeta
WHERE meta_key = '_test'
AND post_id IN (SELECT GROUP_CONCAT(post_id) FROM wp_postmeta
where meta_value = 8023)
The SELECT query posted in the question is equivalent to this one:
SELECT p1.*
FROM `wp_postmeta` p1
INNER JOIN `wp_postmeta` p2 ON p1.`post_id` = p2.`post_id`
WHERE p1.`meta_key` = '_test'
AND p2.`meta_value` = 8023
In fact, if some conditions are met, the MySQL engine converts the original SELECT query into a query similar to this as an optimization.
This SELECT query can be easily changed into the desired UPDATE query:
UPDATE `wp_postmeta` p1
INNER JOIN `wp_postmeta` p2 ON p1.`post_id` = p2.`post_id`
SET p1.`meta_values` = 5.55
WHERE p1.`meta_key` = '_test'
AND p2.`meta_value` = 8023

MySQL multiple selects on second table

I am trying to construct a select statement. The table structure is shown below. I am basically looking to select the three fields on the left table along with the meta_values of the right hand side table that have a meta_key of responsible_service and responsible_officer. These meta_values may or may not exist.
My awful attempt looks like this.
SELECT
`wp_posts`.`ID`,
`wp_posts`.`post_content`,
`wp_posts`.`post_title`
FROM(
`wp_posts`
INNER JOIN `wp_postmeta` ON (`wp_posts`.`ID` = `wp_postmeta`.`post_id`),
(Select `wp_postmeta`.meta_value where`wp_postmeta`.meta_key='responsible_officer') as Responsible Officer),
(Select `wp_postmeta`.meta_value where `wp_postmeta`.meta_key='responsible_service') as Responsible Service ),
The result should look like this
This will give you 1 or more rows per wp_posts.ID depending on how many 'responsible_officer' and 'responsible_service' are found. If none are found meta_key and meta_value will be null
SELECT
`wp_posts`.`ID`,
`wp_posts`.`post_content`,
`wp_posts`.`post_title`,
max(case `wp_postmeta`.meta_key
when 'responsible_officer' then `wp_postmeta`.meta_value end) as responsible_officer,
max(case `wp_postmeta`.meta_key
when 'responsible_service' then `wp_postmeta`.meta_value end) as responsible_service
FROM
`wp_posts`
LEFT JOIN `wp_postmeta` ON `wp_posts`.`ID` = `wp_postmeta`.`post_id`
AND `wp_postmeta`.meta_key in ('responsible_officer', 'responsible_service')
group by `wp_posts`.`ID`,
`wp_posts`.`post_content`,
`wp_posts`.`post_title`;
Check this also:
select postmeta.meta_value, posts.ID, posts.`post_content`,
posts.`post_title` from `wp_posts` posts join `wp_postmeta` postmeta on posts.ID = postmeta.post_id where postmeta.meta_key IN ('responsible_officer', 'responsible_service')
SELECT
`wp_posts`.`ID`,
`wp_posts`.`post_content`,
`wp_posts`.`post_title`
FROM `wp_posts`
JOIN `wp_postmeta` ON (`wp_posts`.`ID` = `wp_postmeta`.`post_id`)
where `wp_postmeta`.meta_key in ('responsible_officer', 'responsible_service')

How to serialize C# data to wp_postmeta (MySQL longtext column)

I'm trying to write a SQL update that takes part of a string and updates with part of another string (both strings already in the database).
My query looks like this, but it doesn't work :(
UPDATE wp_postmeta SET meta_value = REPLACE(meta_value,
SELECT SUBSTRING(meta_value, 1, 23) AS meta_header
FROM wp_postmeta WHERE meta_id = 8443,
SELECT SUBSTRING(meta_value, 1, 23) AS meta_header
FROM wp_postmeta WHERE meta_id = 2037)
WHERE post_id = 8443
Any ideas for how to write it?
Thanks.
Does this work?
replace into wp_postmeta (meta_id,meta_value)
select 8443,concat(SUBSTRING(meta_value,1,23),t.end)
from wp_postmeta JOIN
(select SUBSTRING(meta_value,24) as end from wp_postmeta where meta_id=8443) as t
where meta_id=2037
Solution with group_concat:
replace into wp_postmeta (meta_id,meta_value)
select 8443,group_concat(type SEPARATOR '') from
(select mem_id,substring(type,1,23) as type from wp_postmeta where mem_id=2037
UNION
select mem_id,substring(type,24) as type from wp_postmeta where mem_id=8443) as t;
Try this by joining your tables
UPDATE wp_postmeta wp1
JOIN wp_postmeta wp2 ON (wp1.meta_id =wp2.meta_id )
JOIN wp_postmeta wp3 ON (wp1.meta_id =wp3.meta_id )
SET wp1.meta_value = REPLACE(wp1.meta_value, SUBSTRING(wp2.meta_value, 1, 23) ,SUBSTRING(wp3.meta_value, 1, 23))
WHERE wp2.meta_id = 8443 AND wp3.meta_id = 2037
AND wp1.post_id = 8443

How to multiply a value

I've a table called WP_POSTMETA with a column META_KEY and a column META_VALUE.
I'd like to multiply the META_VALUE '_PRICE' with a factor 1.5
Who can help me with the right MYSQL query? I have to multiply prices for about 8000+ items and want to update them all in one action...
Please see also
You can try like this:-
Update WP_POSTMETA
SET META_VALUE = Meta_Value*1.5
WHERE META_KEY = '_PRICE'
Assuming I understand correctly...
You want to update the Meta_value * 1.5 where the meta_key = '_PRICE'
Update WP_POSTMETA
SET META_VALUE = Meta_Value*1.5
WHERE META_KEY = '_PRICE'
To view the results before you run the above update. update..
Select MEta_value*1.5 as newVal, Meta_value, Meta_key
from WP_POSTMETA
WHERE META_KEY = '_PRICE'
Or like this with a transaction:
BEGIN;
Update WP_POSTMETA
SET META_VALUE = Meta_Value*1.5
WHERE META_KEY = '_PRICE'
Select MEta_value*1.5 as newVal, Meta_value, Meta_key
from WP_POSTMETA
WHERE META_KEY = '_PRICE'
If you're happy with the result
COMMIT;
Else do a rollback
ROLLBACK;
Actually you should do all statements that modifies production data in a transaction.